Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Mar 2000 23:40:04 -0800 (PST)
From:      Patrick Bihan-Faou <patrick@mindstep.com>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/17311: bug in the code handling ioctl SIOCGIFCONF
Message-ID:  <200003110740.XAA57372@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/17311; it has been noted by GNATS.

From: Patrick Bihan-Faou <patrick@mindstep.com>
To: freebsd-gnats-submit@FreeBSD.org,
	Patrick Bihan-Faou <patrick@mindstep.com>
Cc:  
Subject: Re: kern/17311: bug in the code handling ioctl SIOCGIFCONF
Date: Sat, 11 Mar 2000 02:39:35 -0500

 The following test code will provide better report on the version of the bug
 present in the system.
 
 
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/time.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
 #include <sys/sockio.h>
 
 #define VERBOSE_CHECK
 int check55(char *start,char *end,int mod)
 {
 	int	startoff=-1,endoff=0;
 	int	off=0,c=0;
 int ret = 0;
 
 #ifdef VERBOSE_CHECK
 	printf("%03d\t",off);
 #endif
 	for(;start<end;start++,off++)
 	{
 		if(*start != 0x55)
 		{
 			if(startoff<0)
 			{
 				startoff=off;
 			}
 			endoff=off;
 		}
 #ifdef VERBOSE_CHECK
 		if(++c>=33)
 		{
 			printf("\n%03d\t",off);
 			c=1;
 		}
 		printf("%02x ",*(unsigned char*)start);
 #endif
 	}
 	printf("\n");
 	if(startoff>=0)
 	{
 		printf("	** buffer changed from %d to %d => %d bytes modified
 **\n",startoff,endoff, endoff - startoff + 1);
 if (mod != (endoff-startoff+1))
     ret = 1;
 
  }
 
 return ret;
 }
 
 main()
 {
   struct ifconf ifc;
   char *x;
   struct ifreq *ifr;
   struct sockaddr_in *sin;
   int len,ret;
   int s;
   char buf[1024];
   int bug=0;
 
 #define END_TEST	300
 
   if ((s = socket(AF_INET,SOCK_STREAM,0)) == -1) return -1;
 
   for (len=1;len<=END_TEST;len++) {
     ifc.ifc_buf = buf;
     ifc.ifc_len = len;
 	memset(buf,0x55,sizeof(buf));
 	printf("\n");
 	printf("[Try with len=%d]\n",len);
     if ((ret=ioctl(s,SIOCGIFCONF,&ifc)) < 0)
 	{
 		printf(" => ioctl failed (returned %d, errno=%d)\n",ret,errno);
 	}
 	printf(" => ioctl succeeded, pretends it wrote %d bytes\n",ifc.ifc_len);
 
 if ((ifc.ifc_len > len) && bug < 1)
 {
  bug = 1;
 }
  printf("\n");
 if(check55(buf,buf+sizeof(buf),ifc.ifc_len) && bug > 0)
 {
  bug = 2;
 }
  printf("\n");
   }
 
 switch (bug)
 {
     case 0:
         printf("\n\n*** Implementation OK (FIXED) *** \n\n");
         break;
     case 1:
         printf("\n\n*** Implementation returns incorrect ifc.ifc_len, but
 buffer OK (HEAD) ***\n\n");
         break;
     case 2:
         printf("\n\n*** Implementation corrupts buffer (RELENG_3) ***\n\n");
         break;
     default:
         printf("\n\n*** Huh ??? %d ***", bug);
         break;
 }
   return bug;
 }
 
 
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200003110740.XAA57372>