Nmap Development mailing list archives

Re: gcc-4 troubleshooting


From: Matthew Heine <mheine () sigovs com>
Date: Mon, 29 Aug 2005 17:04:41 -0400

+    for(; ifr && *((u8 *)ifr) && ((u8 *)ifr) < ((u8 *)ifr) + ifc.ifc_len; 
I think this last changed line should be 


+    for(; ifr && *((u8 *)ifr) && ((u8 *)ifr) < ((u8 *)buf) + ifc.ifc_len; 

instead. 


Duilio Protti wrote:

Fyodor wrote:

While this works for now, a better approach might be to find all the
lines that apparently violate C99 alias rules and fix them.  Here is
an example that SoC student Paul Tarjan found (from tcpip.cc):

buf = (u8 *) safe_zalloc(bufsz);
[...]
ifr = (struct ifreq *) buf;
[...]
  for(; ifr && *((u8 *)ifr) && ((u8 *)ifr) < buf + ifc.ifc_len;
       ((*(char **)&ifr) += len ))

I don't know if it is technically legal or not, but gcc doesn't seem
to like it with -O2.  It is pretty gross anyway, and deserves to be
changed for that reason if no other.

 


An example similar to the code above can be found on a post by Marcus 
Brinkmann here:

http://lists.gnu.org/archive/html/l4-hurd/2005-01/msg00027.html

According to Marcus, the following code is good (for aliasing rules):

 struct a;

struct a_d { struct a a_m; int etc; };

struct a_d a_i;
struct a *ap = &a_i.a_m;

But this other one doesn't respect well the mentioned rules:

struct a *ap = malloc (sizeof (struct a_d));

struct a_d *adp = (struct adp *) ap;


With this in mind, the tcpip.cc fragment above can be changed in the 
form described on the attached patch.


Bye,
Duilio.

------------------------------------------------------------------------

--- tcpip.cc.orig      2005-08-29 15:40:32.000000000 -0300
+++ tcpip.cc   2005-08-29 16:38:22.000000000 -0300
@@ -2159,10 +2159,10 @@
  struct ifconf ifc;
  struct ifreq *ifr;
  struct ifreq tmpifr;
+  struct ifreq *buf;
#endif
  int len, rc;
  char *p;
-  u8 *buf;
  int bufsz;
  struct sockaddr_in *sin;
  u16 ifflags;
@@ -2194,13 +2194,13 @@
    sd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sd < 0) pfatal("socket in getinterfaces");
    bufsz = 20480;
-    buf = (u8 *) safe_zalloc(bufsz);
+    buf = (struct ifreq *) safe_zalloc(bufsz);
    ifc.ifc_len = bufsz;
    ifc.ifc_buf = (char *) buf;
    if (ioctl(sd, SIOCGIFCONF, &ifc) < 0) {
      fatal("Failed to determine your configured interfaces!\n");
    }
-    ifr = (struct ifreq *) buf;
+    ifr = buf;
    if (ifc.ifc_len == 0) 
      fatal("getinterfaces: SIOCGIFCONF claims you have no network interfaces!\n");
#if HAVE_SOCKADDR_SA_LEN
@@ -2219,7 +2219,7 @@
    printf("Size of struct ifreq: %d\n", sizeof(struct ifreq));
#endif

-    for(; ifr && *((u8 *)ifr) && ((u8 *)ifr) < buf + ifc.ifc_len; 
+    for(; ifr && *((u8 *)ifr) && ((u8 *)ifr) < ((u8 *)ifr) + ifc.ifc_len; 
      ((*(char **)&ifr) += len )) {
#if TCPIP_DEBUGGING
      printf("ifr_name size = %d\n", sizeof(ifr->ifr_name));
 

------------------------------------------------------------------------



_______________________________________________
Sent through the nmap-dev mailing list
http://cgi.insecure.org/mailman/listinfo/nmap-dev
 



_______________________________________________
Sent through the nmap-dev mailing list
http://cgi.insecure.org/mailman/listinfo/nmap-dev


Current thread: