Переполнение буфера во fread и strncpy в C

#c #buffer-overflow

#c #переполнение буфера

Вопрос:

Я получаю информацию о переполнении буфера из appscan для приведенного ниже набора кода. Я не уверен, что в этом не так. Если кто-нибудь предложит решение, это было бы здорово. Общий код предназначен для всей платформы.

 int main()
{
   char* src = NULL;
   char* chenv = getenv("HOME");
   if (chenv == NULL || strlen(chenv) == 0)
       return -1;
   else
   {
       int len = strlen(chenv);
       src = new char[len 1];
       strncpy(src, chenv, len); // AppScan throws buffer overflow
       src[len 1]='';
   }
   FILE* fp;
   char content[4096];
   int len = 0;
   fp = fopen("filename.txt", "r");
   if(fp)
   {
       while( (len = fread(content, sizeof(char), sizeof(content), fp))> 0) // AppScan throws buffer overflow on content
       {
           docopy(content, len);// External funtion call. 
       }
   }

   return 0;  
}
  

Комментарии:

1. @Evg В коде используется оператор C new , поэтому я предполагаю, что это на самом деле C .

2. @IanAbbott, правильно…

3. src[len 1]=''; должно быть src[len]=''; .

4. Мне действительно не нравится это предупреждение об усечении stringop. В любом случае, простое решение первого предупреждения — просто использовать std::string , что вам, вероятно, следовало бы делать в любом случае. Согласитесь, что неясно, в чем его проблема с fread . Что произойдет, если вместо этого вы просто используете plain read или std::istream::read ?

5. Я не понимаю новообретенной популярности strncpy . Это подвержено ошибкам. В коде, о котором идет речь, размер копируемой строки известен, выделен достаточно большой буфер, который strcpy будет делать именно то, что необходимо. Этот танец strncpy с длиной, которая меньше фактического буфера, за которым следует заполнение нулевого ограничителя (даже если код был исправлен, чтобы поместить его в правильное местоположение), здесь бессмыслен.

Ответ №1:

Вместо strncpy я попытался использовать strdup() и проблема была решена. Но у fread все еще возникает проблема.