[devel] IA: destination buffer overflow - ppp

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Ср Ноя 28 13:34:38 MSK 2007


On Wed, Nov 28, 2007 at 01:21:42PM +0300, Dmitriy Khanzhin wrote:
> Alexey Tourbin пишет:
> > On Wed, Nov 28, 2007 at 12:57:38PM +0300, Dmitriy Khanzhin wrote:
> > Вы что сделать-то хотите?  Чтобы gcc не выдавал warning?
> 
> Я хочу понять, как оно работает, и сделать, чтобы не было warning'а и
> что-бы работало.

Вы не рубите.  Почитайте книжку называется "Си" авторы Керниган и Ритчи.

> > Короче лучше используйте snprintf, там ошибиться сложнее что к чему.
> > 
> > Но snprintf это интерпретатор, теряется ЭФФЕККТИВНОСТЬ КОДА!!
> > 
> Патч с применением snprintf я показывал вчера
> http://lists.altlinux.org/pipermail/devel/attachments/20071127/72869196/attachment.ksh

> --- ppp-2.4.4/pppd/plugins/radius/clientid.c.orig       2007-09-29 16:38:20 +0400                                                            
> +++ ppp-2.4.4/pppd/plugins/radius/clientid.c    2007-11-27 09:08:24 +0300                                                                    
> @@ -104,18 +104,29 @@                                                                                                                        
>  UINT4 rc_map2id(char *name)                                                                                                                 
>  {                                                                                                                                           
>         struct map2id_s *p;                                                                                                                  
> -       char ttyname[PATH_MAX];                                                                                                              
> +       char *ttyname;                                                                                                                       
> +       int ttyname_len=0;                                                                                                                   
> +       char prefix_dev[6];                                                                                                                  
>                                                                                                                                              
> -       *ttyname = '\0';                                                                                                                     
> -       if (*name != '/')                                                                                                                    
> -               strcpy(ttyname, "/dev/");                                                                                                    
> -                                                                                                                                            
> -       strncat(ttyname, name, sizeof(ttyname));                                                                                             
> +       *prefix_dev = "";                                                                                                                    
> +       ttyname_len = strlen(name)+1;                                                                                                        
> +                                                                                                                                            
> +       if (*name != '/') {                                                                                                                  
> +               *prefix_dev = "/dev/";                                                                                                       

Не беритесь, не беритесь, не беритесь за то чего Вы не понимаете.

> +               ttyname_len = ttyname_len+strlen(prefix_dev);                                                                                
> +                       }                                                                                                                    
> +                                                                                                                                            
> +       ttyname = calloc(ttyname_len, sizeof(char));                                                                                         
> +       snprintf(ttyname, ttyname_len, "%s%s", prefix_dev, name);                                                                            
>                                                                                                                                              
>         for(p = map2id_list; p; p = p->next)                                                                                                 
> -               if (!strcmp(ttyname, p->name)) return p->id;                                                                                 
> +               if (!strcmp(ttyname, p->name)) {                                                                                             
> +                       free(ttyname);                                                                                                       
> +                       return p->id;                                                                                                        
> +                               }                                                                                                            
>                                                                                                                                              
>         warn("rc_map2id: can't find tty %s in map database", ttyname);                                                                       
>                                                                                                                                              
> +       free(ttyname);                                                                                                                       
>         return 0;                                                                                                                            
>  }                                                                                                                                           
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20071128/3dd4276d/attachment-0002.bin>


Подробная информация о списке рассылки Devel