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

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

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

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



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

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

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


<<Назад  Вперед>>Страницы: 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
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

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




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


Время выполнения скрипта: 0.0366. Количество выполненных запросов: 19, время выполнения запросов 0.0269