Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F132519454
D16459.id45944.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D16459.id45944.diff
View Options
Index: contrib/bsnmp/snmp_mibII/mibII.h
===================================================================
--- contrib/bsnmp/snmp_mibII/mibII.h
+++ contrib/bsnmp/snmp_mibII/mibII.h
@@ -57,8 +57,9 @@
#include "snmp_mibII.h"
#include "mibII_tree.h"
-/* maximum size of the interface alias */
+/* maximum size of the interface alias unless overridden with net.ifdescr_maxlen */
#define MIBIF_ALIAS_SIZE (64 + 1)
+#define MIBIF_ALIAS_SIZE_MAX 1024
/*
* Interface list and flags.
@@ -81,8 +82,6 @@
uint64_t hc_imcasts;
uint64_t hc_ipackets;
- /* this should be made public */
- char alias[MIBIF_ALIAS_SIZE];
};
#define MIBIF_PRIV(IFP) ((struct mibif_private *)((IFP)->private))
Index: contrib/bsnmp/snmp_mibII/mibII.c
===================================================================
--- contrib/bsnmp/snmp_mibII/mibII.c
+++ contrib/bsnmp/snmp_mibII/mibII.c
@@ -439,11 +439,15 @@
int
mib_fetch_ifmib(struct mibif *ifp)
{
+ static int kmib[2] = { -1, 0 }; /* for sysctl net.ifdescr_maxlen */
+
int name[6];
+ size_t kmiblen = nitems(kmib);
size_t len;
void *newmib;
struct ifmibdata oldmib = ifp->mib;
struct ifreq irr;
+ unsigned int alias_maxlen = MIBIF_ALIAS_SIZE_MAX;
if (fetch_generic_mib(ifp, &oldmib) == -1)
return (-1);
@@ -515,18 +519,69 @@
}
out:
+
+ /*
+ * Find sysctl mib for net.ifdescr_maxlen (one time).
+ * kmib[0] == -1 at first call to mib_fetch_ifmib().
+ * Then kmib[0] > 0 if we found sysctl mib for net.ifdescr_maxlen.
+ * Else, kmib[0] == 0 (unexpected error from a kernel).
+ */
+ if (kmib[0] < 0 &&
+ sysctlnametomib("net.ifdescr_maxlen", kmib, &kmiblen) < 0) {
+ kmib[0] = 0;
+ syslog(LOG_WARNING, "sysctlnametomib net.ifdescr_maxlen: %m");
+ }
+
+ /*
+ * Fetch net.ifdescr_maxlen value every time to catch up with changes.
+ */
+ len = sizeof(alias_maxlen);
+ if (kmib[0] > 0 && sysctl(kmib, 2, &alias_maxlen, &len, NULL, 0) < 0) {
+ /* unexpected error from the kernel, use default value */
+ alias_maxlen = MIBIF_ALIAS_SIZE_MAX;
+ syslog(LOG_WARNING, "sysctl net.ifdescr_maxlen: %m");
+ }
+
+ /*
+ * Kernel limit might be decreased after interfaces got
+ * their descriptions assigned. Try to obtain them anyway.
+ */
+ if (alias_maxlen == 0)
+ alias_maxlen = MIBIF_ALIAS_SIZE_MAX;
+
+ /*
+ * Allocate maximum memory for a buffer and later reallocate
+ * to free extra memory.
+ */
+ if ((ifp->alias = malloc(alias_maxlen)) == NULL) {
+ syslog(LOG_WARNING, "malloc(%d) failed: %m", (int)alias_maxlen);
+ goto fin;
+ }
+
strlcpy(irr.ifr_name, ifp->name, sizeof(irr.ifr_name));
- irr.ifr_buffer.buffer = MIBIF_PRIV(ifp)->alias;
- irr.ifr_buffer.length = sizeof(MIBIF_PRIV(ifp)->alias);
+ irr.ifr_buffer.buffer = ifp->alias;
+ irr.ifr_buffer.length = alias_maxlen;
if (ioctl(mib_netsock, SIOCGIFDESCR, &irr) == -1) {
- MIBIF_PRIV(ifp)->alias[0] = 0;
+ free(ifp->alias);
+ ifp->alias = NULL;
if (errno != ENOMSG)
syslog(LOG_WARNING, "SIOCGIFDESCR (%s): %m", ifp->name);
} else if (irr.ifr_buffer.buffer == NULL) {
- MIBIF_PRIV(ifp)->alias[0] = 0;
+ free(ifp->alias);
+ ifp->alias = NULL;
syslog(LOG_WARNING, "SIOCGIFDESCR (%s): too long (%zu)",
ifp->name, irr.ifr_buffer.length);
+ } else {
+ ifp->alias_size = strnlen(ifp->alias, alias_maxlen) + 1;
+
+ if (ifp->alias_size > MIBIF_ALIAS_SIZE)
+ ifp->alias_size = MIBIF_ALIAS_SIZE;
+
+ if (ifp->alias_size < alias_maxlen)
+ ifp->alias = realloc(ifp->alias, ifp->alias_size);
}
+
+fin:
ifp->mibtick = get_ticks();
return (0);
}
@@ -706,6 +761,10 @@
mibif_reset_hc_timer();
}
+ if (ifp->alias != NULL) {
+ free(ifp->alias);
+ ifp->alias = NULL;
+ }
free(ifp->private);
ifp->private = NULL;
free(ifp->physaddr);
Index: contrib/bsnmp/snmp_mibII/mibII_interfaces.c
===================================================================
--- contrib/bsnmp/snmp_mibII/mibII_interfaces.c
+++ contrib/bsnmp/snmp_mibII/mibII_interfaces.c
@@ -528,7 +528,7 @@
break;
case LEAF_ifAlias:
- ret = string_get(value, MIBIF_PRIV(ifp)->alias, -1);
+ ret = string_get(value, ifp->alias, ifp->alias_size - 1);
break;
case LEAF_ifCounterDiscontinuityTime:
Index: contrib/bsnmp/snmp_mibII/snmp_mibII.h
===================================================================
--- contrib/bsnmp/snmp_mibII/snmp_mibII.h
+++ contrib/bsnmp/snmp_mibII/snmp_mibII.h
@@ -80,6 +80,9 @@
/* to be set by ifType specific modules. This is ifSpecific. */
struct asn_oid spec_oid;
+ char *alias;
+ size_t alias_size;
+
/* private data - don't touch */
void *private;
};
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Oct 18, 2:59 PM (13 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23884049
Default Alt Text
D16459.id45944.diff (4 KB)
Attached To
Mode
D16459: bsnmpd(1): optimize interface description processing
Attached
Detach File
Event Timeline
Log In to Comment