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>
