|
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
By Date
By Thread
Current thread:
- Re: gcc-4 troubleshooting, (continued)
|