]> The Tcpdump Group git mirrors - libpcap/commitdiff
Update to handle arbitrary-length interface descriptions on FreeBSD.
authorXin Li <[email protected]>
Wed, 10 Mar 2010 23:55:44 +0000 (15:55 -0800)
committerGuy Harris <[email protected]>
Wed, 10 Mar 2010 23:55:44 +0000 (15:55 -0800)
Reviewed-by: Guy Harris <[email protected]>
CREDITS
inet.c

diff --git a/CREDITS b/CREDITS
index 1c20f03f02a557d24d93887c2f8dd20b06468f86..128c055db447e65dc4599f071cb73fedbd0765c5 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -129,6 +129,7 @@ Additional people who have contributed patches:
        Uwe Girlich                     <Uwe dot Girlich at philosys dot de>
        Wesley Shields                  <wxs at FreeBSD dot org>
        Xianjie Zhang                   <xzhang at cup dot hp dot com>
        Uwe Girlich                     <Uwe dot Girlich at philosys dot de>
        Wesley Shields                  <wxs at FreeBSD dot org>
        Xianjie Zhang                   <xzhang at cup dot hp dot com>
+       Xin Li                          <delphij at FreeBSD dot org>
        Yen Yen Lim
        Yvan Vanhullebus                <vanhu at sourceforge dot net>
        Yoann Vandoorselaere            <yoann at prelude-ids dot org>
        Yen Yen Lim
        Yvan Vanhullebus                <vanhu at sourceforge dot net>
        Yoann Vandoorselaere            <yoann at prelude-ids dot org>
diff --git a/inet.c b/inet.c
index 494de09ea1ea94ad44d2b2b57035161c400ea759..0b16a659072ddc133827f5f5e9885f694b61aaf7 100644 (file)
--- a/inet.c
+++ b/inet.c
@@ -417,10 +417,9 @@ add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags,
        int s;
        struct ifreq ifrdesc;
 #ifndef IFDESCRSIZE
        int s;
        struct ifreq ifrdesc;
 #ifndef IFDESCRSIZE
-#define _IFDESCRSIZE 64
-       char ifdescr[_IFDESCRSIZE];
-#else /* IFDESCRSIZE */
-       char ifdescr[IFDESCRSIZE];
+       size_t descrlen = 64;
+#else
+       size_t descrlen = IFDESCRSIZE;
 #endif /* IFDESCRSIZE */
 #endif /* SIOCGIFDESCR */
 
 #endif /* IFDESCRSIZE */
 #endif /* SIOCGIFDESCR */
 
@@ -430,28 +429,45 @@ add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags,
         */
        memset(&ifrdesc, 0, sizeof ifrdesc);
        strlcpy(ifrdesc.ifr_name, name, sizeof ifrdesc.ifr_name);
         */
        memset(&ifrdesc, 0, sizeof ifrdesc);
        strlcpy(ifrdesc.ifr_name, name, sizeof ifrdesc.ifr_name);
+       s = socket(AF_INET, SOCK_DGRAM, 0);
+       if (s >= 0) {
+               for (;;) {
+                       free(description);
+                       if ((description = malloc(descrlen)) != NULL) {
 #ifdef __FreeBSD__
 #ifdef __FreeBSD__
-       ifrdesc.ifr_buffer.buffer = ifdescr;
-       ifrdesc.ifr_buffer.length = sizeof(ifdescr);
+                               ifrdesc.ifr_buffer.buffer = description;
+                               ifrdesc.ifr_buffer.length = descrlen;
 #else /* __FreeBSD__ */
 #else /* __FreeBSD__ */
-       ifrdesc.ifr_data = (caddr_t)ifdescr;
+                               ifrdesc.ifr_data = (caddr_t)description;
 #endif /* __FreeBSD__ */
 #endif /* __FreeBSD__ */
-       s = socket(AF_INET, SOCK_DGRAM, 0);
-       if (s >= 0) {
-               if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0 &&
-                   strlen(ifdescr) != 0)
-                       description = ifdescr;
+                               if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0)
+                                       break;
+#ifdef __FreeBSD__
+                               else if (errno == ENAMETOOLONG)
+                                       descrlen = ifrdesc.ifr_buffer.length;
+#endif /* __FreeBSD__ */
+                               else
+                                       break;
+                       } else
+                               break;
+               }
                close(s);
                close(s);
+               if (description != NULL && strlen(description) == 0) {
+                       free(description);
+                       description = NULL;
+               }
        }
 #endif /* SIOCGIFDESCR */
 
        if (add_or_find_if(&curdev, alldevs, name, flags, description,
            errbuf) == -1) {
        }
 #endif /* SIOCGIFDESCR */
 
        if (add_or_find_if(&curdev, alldevs, name, flags, description,
            errbuf) == -1) {
+               free(description);
                /*
                 * Error - give up.
                 */
                return (-1);
        }
                /*
                 * Error - give up.
                 */
                return (-1);
        }
+       free(description);
        if (curdev == NULL) {
                /*
                 * Device wasn't added because it can't be opened.
        if (curdev == NULL) {
                /*
                 * Device wasn't added because it can't be opened.