Nmap Development mailing list archives

Re: Compile error on netbsd


From: Jay Fink <jay.fink () gmail com>
Date: Wed, 26 Aug 2009 20:58:16 -0400

I tried the following with interesting results when using --iflist:

--- tcpip.cc.orig   2009-08-26 20:42:00.000000000 -0400
+++ tcpip.cc    2009-08-26 20:42:16.000000000 -0400
@@ -2945,7 +2945,7 @@
   ifr = ifc.ifc_req;

   for(ifr = ifc.ifc_req;
-      ifr && ifr->ifr_name[0] && (void *) ifr < ifc.ifc_buf + ifc.ifc_len;
+      ifr && ifr->ifr_name[0] && (void *) ifr < (char *) ifc.ifc_buf
+ ifc.ifc_len;
       ifr = (struct ifreq *) ((char *) ifr + len)) {
     struct sockaddr_in *sin;
     struct ifreq tmpifr;
@@ -2956,7 +2956,8 @@
     /* On some platforms (such as FreeBSD), the length of each ifr changes
        based on the sockaddr type used, so we get the next length now. */
 #if HAVE_SOCKADDR_SA_LEN
-    len = ifr->ifr_addr.sa_len + sizeof(ifr->ifr_name);
+     if (ifr->ifr_addr.sa_len > sizeof(ifr->ifr_ifru))
+        len += (ifr->ifr_addr.sa_len - sizeof(ifr->ifr_ifru));
 #else
     len = sizeof(struct ifreq);
 #endif

On debian-current; no change.
On  FreeBSD 8.0-CURRENT-200809 I get the following:
[20:08:35 jrf@pyxis:~/nmap]$ ./nmap --iflist

Starting Nmap 5.05BETA1 ( http://nmap.org ) at 2009-08-26 20:08 EDT
INTERFACES: NONE FOUND(!)
WARNING: Unable to find appropriate interface for system route to 192.168.1.1
WARNING: Unable to find appropriate interface for system route to 127.0.0.1
ROUTES: NONE FOUND(!)

On NetBSD 5.99.11 nmap --iflist hangs indefinitely; if I revert the
second part of the changes, NetBSD spits back the same error as
FreeBSD.

I'll work on these over the next few days to see if I can get it to
build on those systems.

Thanks,
   Jay



On Wed, Aug 26, 2009 at 8:30 PM, Jay Fink<jay.fink () gmail com> wrote:
This is patch doesn't address the error I saw; I am still looking into it.



On Tue, Aug 25, 2009 at 8:36 AM, Jay Fink<jay.fink () gmail com> wrote:
Bingo - it is in the netbsd pkgsrc tree as one of the patches as well;
here is the relevant info from netbsd's pkgsrc patch, I can try to
work into the mainline if you'd like. There is another one as well
which looks even easier.

--- tcpip.cc.orig       2008-09-04 14:41:59.000000000 +0000
+++ tcpip.cc
@@ -2890,12 +2890,10 @@ int sd;
    ifr = (struct ifreq *) buf;
    if (ifc.ifc_len == 0)
      fatal("%s: SIOCGIFCONF claims you have no network
interfaces!\n", __func__);
-#if HAVE_SOCKADDR_SA_LEN
-    /*    len = MAX(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);*/
-    len = ifr->ifr_addr.sa_len + sizeof(ifr->ifr_name);
-#else
    len = sizeof(struct ifreq);
-    /* len = sizeof(SA); */
+#if HAVE_SOCKADDR_SA_LEN
+    if (ifr->ifr_addr.sa_len > sizeof(ifr->ifr_ifru))
+      len += (ifr->ifr_addr.sa_len - sizeof(ifr->ifr_ifru));
 #endif

    /* Debugging code
@@ -2914,10 +2912,13 @@ int sd;
      printf("ifr = %X\n",(unsigned)(*(char **)&ifr));
      */

-      /* On some platforms (such as FreeBSD), the length of each ifr changes
-        based on the sockaddr type used, so we get the next length now */
+      /* On platforms where struct sockaddr has an sa_len member, if
+        ifr_ddr.sa_len is larger then sizeof ifr_ifru, then the actual
+        data extends beyond the end of ifr_ifru. */
+      len = sizeof(struct ifreq);
 #if HAVE_SOCKADDR_SA_LEN
-      len = ifr->ifr_addr.sa_len + sizeof(ifr->ifr_name);
+      if (ifr->ifr_addr.sa_len > sizeof(ifr->ifr_ifru))
+        len += (ifr->ifr_addr.sa_len - sizeof(ifr->ifr_ifru));
 #endif

      /* skip any device with no name */




On Mon, Aug 24, 2009 at 11:55 PM, David Fifield<david () bamsoftware com> wrote:
On Mon, Aug 24, 2009 at 08:11:23PM -0400, Jay Fink wrote:
Got an interesting compile error on a NetBSD5 snapshot:
tcpip.cc: In function 'interface_info* getinterfaces_siocgifconf(int*)':
tcpip.cc:2948: error: pointer of type 'void *' used in arithmetic
gmake[1]: *** [tcpip.o] Error 1
gmake[1]: Leaving directory `/home/jrf/nmap'
gmake: *** [all] Error 2

Can you find out the definition of struct ifconf? Particularly the type
of the ifc_buf member. Perhaps it's a void pointer instead of a char
pointer like on Linux. It should be in <net/if.h>.

David Fifield




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


Current thread: