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.
|