Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Mar 2000 03:17:05 -0500
From:      Patrick Bihan-Faou <patrick@mindstep.com>
To:        gnats-admin@FreeBSD.org, freebsd-bugs@FreeBSD.org
Subject:   Re: kern/17311: bug in the code handling ioctl SIOCGIFCONF
Message-ID:  <02a701bf8b32$3020e0f0$040aa8c0@local.mindstep.com>
References:  <200003110720.XAA56125@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Oops,

Here is the correct test code...


#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 startoff=-1,endoff=0;
 int off=0,c=0;
 int ret = 0;

#ifdef VERY_VERBOSE_CHECK
 printf("%03d\t",off);
#endif
 for(;start<end;start++,off++)
 {
  if(*start != 0x55)
  {
   if(startoff<0)
   {
    startoff=off;
   }
   endoff=off;
  }
#ifdef VERY_VERBOSE_CHECK
  if(++c>=33)
  {
   printf("\n%03d\t",off);
   c=1;
  }
  printf("%02x ",*(unsigned char*)start);
#endif
 }
 if(startoff>=0)
 {
#ifdef VERBOSE_CHECK
  printf(" ** buffer changed from %d to %d => %d bytes modified
**\n",startoff,endoff, endoff - startoff + 1);
#endif
    ret = endoff-startoff+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;
  int mod=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));
#ifdef VERBOSE_CHECK
 printf("\n[Try with len=%d]\n",len);
#else
 printf("try %4d\t", len);
#endif
     if ((ret=ioctl(s,SIOCGIFCONF,&ifc)) < 0)
 {
  printf("\n\n => ioctl failed (returned %d, errno=%d)\n",ret,errno);
 }
#ifdef VERBOSE_CHECK
 printf(" => ioctl succeeded, pretends it wrote %d bytes\n",ifc.ifc_len);
#else
 printf("pretends %4d\t\t", ifc.ifc_len);
#endif

 mod = check55(buf,buf+sizeof(buf));
 printf("modified %4d\t", mod);
 if (bug < 2 && mod < ifc.ifc_len)
 {
   bug = 2;
 }
 else if (bug < 1 && ifc.ifc_len > len)
 {
  bug = 1;
 }
 printf("bug %4d\n", bug);
  }

 switch (bug)
 {
     case 0:
         printf("\n\n*** Implementation OK (FIXED)*** \n\n");
         break;
     case 1:
         printf("\n\n*** Implementation corrupts buffer (RELENG_3)***\n\n");
         break;
     case 2:
         printf("\n\n*** Implementation returns incorrect ifc.ifc_len, but
buffer OK (HEAD)***\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?02a701bf8b32$3020e0f0$040aa8c0>