Объединенный Открытый Проект - Сайт для Настоящих Компьютерщиков

Объединенный Открытый Проект

Сайт для Настоящих Компьютерщиков

; Логин:
  Пароль:
Обычный
Безопасный
Запомнить пользователя



Зарегистрироваться
Забыли пароль?
 
 
 
Объединенный Открытый Проект »   Программирование »   С/C++ »   Работа с конфиг-файлами
RSS
Реклама: Что такое лечение рака молочной железы 1 типа. Рак молочной железы нетрадиционные методы лечения.

Работа с конфиг-файлами

Вида параметр=значение


<<Назад  Вперед>>Страницы: 1 2
Модератор: wsx
Печать
 
kolian
Новичок


Всего сообщений: 9
Рейтинг пользователя: 2





Дата регистрации на форуме:
9 авг. 2005
Мда.. действительно переполнение

Ну тут можно было поступить двумя способами: динамически ваделять память для буфера или сделать ограничение на размер строки.

Безопасность это еще тот вопрос (с)
т.к в первом случае кто нить может загенерить строку в гигабайт, тогда и ламяти для запуска других процессов не будет. Поэтому я пошел по второму пути:


--- Cfg_old.c
+++ Cfg_new.c
@@ -46,7 +46,15 @@
  return count;
}

+enum cfg_file_errors
+{
+  E_CFG_S_BUF_SIZE=-1, //длина строки из файла больше размера буфера для сохранения
+  E_CFG_I_BUF_SIZE=-2, //длина строки из файла слишком большая
+};

+/*максимальная длина строки в конфигурационном файле -1*/
+#define MAX_STRING_LEN 4096
+
/*
  *функция read_sec_parm() позволяет прочесть
  *заданный параметр секции

@@ -64,8 +72,8 @@
int read_sec_parm(char *filename,char *sect_name,char *parm_name,char *save_buffer,size_t save_size)
{
  FILE *cfg_file;    /*указатель на конфигурационный файл*/
-  char Order[4000];    /*имя секции*/
-  char buf[4000];    /*временный буфер строки из файла*/
+  char Order[MAX_STRING_LEN];    /*имя секции*/
+  char buf[MAX_STRING_LEN];    /*временный буфер строки из файла*/
  int num_char=0;
  
  memset(Order,' ',sizeof(Order));
@@ -76,7 +84,10 @@

  /*построчное сканирование файла*/
  while(fgets(buf,sizeof(buf),cfg_file)!=NULL)
-  {  
+  {
+    if(strlen(buf)==sizeof(buf)-1)
+      return E_CFG_I_BUF_SIZE;
+    
    int i=0;
    char ch=buf[i];/*временная переменная, в которую заносится символ*/
    
@@ -107,7 +118,7 @@
    /*символ ' ' является допустимым*/
    while((ch!='\t')&&(ch!=';')&&(ch!='#')&&(ch!='\n')) ch=buf[++j];
    num_char=j-(i+strlen(parm_name)+sizeof('='));
-    if(num_char>=save_size) {num_char=-1;break;}
+    if(num_char>=save_size){num_char=E_CFG_S_BUF_SIZE;break;}
    strncpy(save_buffer,&buf[i+strlen(parm_name)+sizeof('=')],num_char);
    save_buffer[num_char]=0;


---
Real programmers don't comment their code. It was hard to write, it should be hard to understand.
wsx
Модератор раздела
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1084
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
Впринципе уже получше, однако действительно к вопросу безопасности стоит подходить серьёзно...
Попробую проанализировать код и погонять его на тестовой машине...Может что ещё найдётся!
Часть сообщений этой темы была выделена в тему "Вопрос по C++" (10 декабря 2007 11:02)
<<Назад  Вперед>>Страницы: 1 2
Модератор: wsx
Печать
Объединенный Открытый Проект »   Программирование »   С/C++ »   Работа с конфиг-файлами
RSS
Быстрый переход в раздел:


Время выполнения скрипта: 0.6759. Количество выполненных запросов: 18, время выполнения запросов 0.3755
Rambler's Top100