| kolian
Новичок
Всего сообщений: 9 Рейтинг пользователя: 2
Дата регистрации на форуме: 9 авг. 2005
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 16 августа 2005 23:30
Мда.. действительно переполнение
Ну тут можно было поступить двумя способами: динамически ваделять память для буфера или сделать ограничение на размер строки.
Безопасность это еще тот вопрос (с) т.к в первом случае кто нить может загенерить строку в гигабайт, тогда и ламяти для запуска других процессов не будет. Поэтому я пошел по второму пути:
--- 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.
|