IF-MIB::ifPhysAddress bug

Kuroishi Mitsuo <[email protected]>
Newsgroups gmane.network.net-snmp.user
Message-ID <[email protected]>
Hi, I'm Mitsuo.

I found a problem that causes net-snmp to respond
IF-MIB::ifPhysAddress with wrong value.

More specifically 1st octet of MAC addres(00:xx:xx:xx:xx:xx)
bacomes always 00.

My environment is NetBSD 3 on Virtualbox.
Though I use the net-snmp 5.6.1.1 on it, as far as I take a look
the latest one it seems to have a same problem.

A patch for fixing this is below.

|
|struct sockaddr_dl {
|       u_char      sdl_len;    /* Total length of sockaddr */
|       sa_family_t sdl_family; /* AF_LINK */
|       u_int16_t   sdl_index;  /* if != 0, system given index for interface */
|       u_char      sdl_type;   /* interface type */
|       u_char      sdl_nlen;   /* interface name length, no trailing 0 reqd. */
|       u_char      sdl_alen;   /* link level address length */
|       u_char      sdl_slen;   /* link layer selector length */
|       char        sdl_data[24]; /* minimum work area, can be larger;
|                                    contains both if name and ll address */
|};
|

The sdl_data contains both if name and ll address so filling \0
isn't right.

Regards,

--
Kuroishi Mitsuo



Index: agent/mibgroup/if-mib/data_access/interface_sysctl.c
===================================================================
--- agent/mibgroup/if-mib/data_access/interface_sysctl.c
+++ agent/mibgroup/if-mib/data_access/interface_sysctl.c
@@ -325,7 +325,7 @@
     struct sockaddr *a;
     struct sockaddr_dl *adl;
     int amask;
-    char *if_name;
+    char if_name[64];
     int flags;
 
     DEBUGMSGTL(("access:interface:container:sysctl",
@@ -363,7 +363,6 @@
     for (cp = if_list; cp < if_list + if_list_size; cp += ifp->ifm_msglen) {
 
         ifp = (struct if_msghdr *) cp;
-        if_name = NULL;
         flags = 0;
         adl = NULL;
 
@@ -386,8 +385,13 @@
                 }
             }
             adl = (struct sockaddr_dl *) a;
-            if_name = (char *) adl->sdl_data;
-            if_name[adl->sdl_nlen] = '\0';
+
+	    if (sizeof(if_name) < adl->sdl_nlen + 1) {
+                snmp_log(LOG_ERR, "no space for interface name"
+                                   "(sdl_nlen: %lu bytes)\n", adl->sdl_nlen);
+                return -3;
+	    }
+            snprintf(if_name, adl->sdl_nlen + 1, "%s", adl->sdl_data);
         }
         if (!(ifp->ifm_addrs & RTA_IFP) || if_name == NULL) {
             snmp_log(LOG_ERR, "ifm_index %u: no interface name
                 in message, "

------------------------------------------------------------------------------
_______________________________________________
Net-snmp-users mailing list
[email protected]
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.