Nmap Development mailing list archives

Re: Compile error on netbsd


From: Jay Fink <jay.fink () gmail com>
Date: Fri, 28 Aug 2009 11:27:04 -0400

Finally had a chance to look into this some more; David was dead on;
the ifconf struct is different on NetBSD;  ifcu_buf  was changed to
void * during a core address type cull:

struct  ifconf {
        int     ifc_len;                /* size of associated buffer */
        union {
                void *  ifcu_buf;
                struct  ifreq *ifcu_req;
        } ifc_ifcu;

As a dirty trick I changed it back and it compiles but still does not
send back an iflist, I will work on a macro or something to replace it
but I'm not sure why it kicks back it can't find the information yet.

Note FreeBSD8 and Linux use the core address pointer.

I found another issue too also specific to NetBSD but possibly others
the - gnu sed syntax for inserting NCAT_VERSION is not portable; this
happens with a fresh svn checkout; the dirty fix is to install gsed
then alias sed to it; I'll look into a long term fix for this as well:


gmake[1]: Leaving directory `/var/tmp/foo/nsock/src'
sed -i -e 's/^#[ \t]*define[ \t]\+NCAT_VERSION[ \t]\+\(".*"\)/#define
NCAT_VERSION "5.05BETA1"/' ncat/ncat.h
sed: unknown option -- i
usage:  sed [-aEnr] script [file ...]
        sed [-aEnr] [-e script] ... [-f script_file] ... [file ...]
gmake: *** [ncat/ncat.h] Error 1






On Thu, Aug 27, 2009 at 6:53 PM, Jay Fink<jay.fink () gmail com> wrote:
The problem is only on netbsd, when I did a clean build on freebsd it
works fine although you need to be root to get all of the information.
Will keep working on the netbsd side only.

On Wed, Aug 26, 2009 at 8:58 PM, Jay Fink<jay.fink () gmail com> wrote:
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: