From ecb48084c9c4c62f17cb5342db50cbf02a5298ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C5=A0afr=C3=A1nek?= Date: Mon, 25 Jun 2007 09:09:15 +0000 Subject: [PATCH] - fix snmptrapd hostname logging - fix udpEndpointProcess remote IP address - fix -M option of net-snmp-utils Resolves: #238587 #236551 #244784 --- net-snmp-5.3.1-mib-option.patch | 10 ++ net-snmp-5.4-hostname.patch | 206 ++++++++++++++++++++++++++++++++ net-snmp-5.4-udp-endpoint.patch | 12 ++ net-snmp.spec | 14 +++ 4 files changed, 242 insertions(+) create mode 100644 net-snmp-5.3.1-mib-option.patch create mode 100644 net-snmp-5.4-hostname.patch create mode 100644 net-snmp-5.4-udp-endpoint.patch diff --git a/net-snmp-5.3.1-mib-option.patch b/net-snmp-5.3.1-mib-option.patch new file mode 100644 index 0000000..f632dcf --- /dev/null +++ b/net-snmp-5.3.1-mib-option.patch @@ -0,0 +1,10 @@ +--- net-snmp-5.3.1/snmplib/snmp_parse_args.c.orig 2005-11-23 10:11:40.000000000 +0100 ++++ net-snmp-5.3.1/snmplib/snmp_parse_args.c 2007-06-14 13:10:54.000000000 +0200 +@@ -275,6 +275,7 @@ + break; + + case 'M': ++ netsnmp_get_mib_directory(); /* prepare the default directories */ + netsnmp_set_mib_directory(optarg); + break; + #endif /* DISABLE_MIB_LOADING */ diff --git a/net-snmp-5.4-hostname.patch b/net-snmp-5.4-hostname.patch new file mode 100644 index 0000000..048ac45 --- /dev/null +++ b/net-snmp-5.4-hostname.patch @@ -0,0 +1,206 @@ +--- net-snmp-5.4/apps/snmptrapd_log.c.orig 2006-09-15 02:48:43.000000000 +0200 ++++ net-snmp-5.4/apps/snmptrapd_log.c 2007-05-03 12:19:58.000000000 +0200 +@@ -626,6 +626,8 @@ + char fmt_cmd = options->cmd; /* what we're formatting */ + u_char *temp_buf = NULL; + size_t temp_buf_len = 64, temp_out_len = 0; ++ char *tstr; ++ unsigned int oflags; + + if ((temp_buf = calloc(temp_buf_len, 1)) == NULL) { + return 0; +@@ -681,125 +683,59 @@ + * Write the numerical transport information. + */ + if (transport != NULL && transport->f_fmtaddr != NULL) { +- char *tstr = +- transport->f_fmtaddr(transport, pdu->transport_data, +- pdu->transport_data_length); +- if (!snmp_strcat +- (&temp_buf, &temp_buf_len, &temp_out_len, 1, (u_char *)tstr)) { +- if (tstr != NULL) { +- free(tstr); +- } +- if (temp_buf != NULL) { +- free(temp_buf); +- } ++ oflags = transport->flags; ++ transport->flags &= ~NETSNMP_TRANSPORT_FLAG_HOSTNAME; ++ tstr = transport->f_fmtaddr(transport, pdu->transport_data, ++ pdu->transport_data_length); ++ transport->flags = oflags; ++ ++ if (!tstr) goto noip; ++ if (!snmp_strcat(&temp_buf, &temp_buf_len, &temp_out_len, ++ 1, (u_char *)tstr)) { ++ SNMP_FREE(temp_buf); ++ SNMP_FREE(tstr); + return 0; + } +- if (tstr != NULL) { +- free(tstr); +- } ++ SNMP_FREE(tstr); + } else { +- if (!snmp_strcat +- (&temp_buf, &temp_buf_len, &temp_out_len, 1, +- "")) { +- if (temp_buf != NULL) { +- free(temp_buf); +- } ++noip: ++ if (!snmp_strcat(&temp_buf, &temp_buf_len, &temp_out_len, 1, ++ (const u_char*)"")) { ++ SNMP_FREE(temp_buf); + return 0; + } + } + break; + +- /* +- * Write a host name. +- */ + case CHR_PDU_NAME: + /* +- * Right, apparently a name lookup is wanted. This is only reasonable +- * for the UDP and TCP transport domains (we don't want to try to be +- * too clever here). ++ * Try to convert the numerical transport information ++ * into a hostname. Or rather, have the transport-specific ++ * address formatting routine do this. ++ * Otherwise falls back to the numeric address format. + */ +-#ifdef NETSNMP_TRANSPORT_TCP_DOMAIN +- if (transport != NULL && (transport->domain == netsnmpUDPDomain || +- transport->domain == +- netsnmp_snmpTCPDomain)) { +-#else +- if (transport != NULL && transport->domain == netsnmpUDPDomain) { +-#endif +- /* +- * This is kind of bletcherous -- it breaks the opacity of +- * transport_data but never mind -- the alternative is a lot of +- * munging strings from f_fmtaddr. +- */ +- struct sockaddr_in *addr = +- (struct sockaddr_in *) pdu->transport_data; +- if (addr != NULL +- && pdu->transport_data_length == +- sizeof(struct sockaddr_in)) { +- if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, +- NETSNMP_DS_APP_NUMERIC_IP)) { +- host = +- gethostbyaddr((char *) &(addr->sin_addr), +- sizeof(struct in_addr), AF_INET); +- } +- if (host != NULL) { +- if (!snmp_strcat +- (&temp_buf, &temp_buf_len, &temp_out_len, 1, +- (u_char *)host->h_name)) { +- if (temp_buf != NULL) { +- free(temp_buf); +- } +- return 0; +- } +- } else { +- if (!snmp_strcat +- (&temp_buf, &temp_buf_len, &temp_out_len, 1, +- (u_char *)inet_ntoa(addr->sin_addr))) { +- if (temp_buf != NULL) { +- free(temp_buf); +- } +- return 0; +- } +- } +- } else { +- if (!snmp_strcat +- (&temp_buf, &temp_buf_len, &temp_out_len, 1, +- "")) { +- if (temp_buf != NULL) { +- free(temp_buf); +- } +- return 0; +- } +- } +- } else if (transport != NULL && transport->f_fmtaddr != NULL) { +- /* +- * Some other domain for which we do not know how to do a name +- * lookup. Fall back to the formatted transport address. +- */ +- char *tstr = +- transport->f_fmtaddr(transport, pdu->transport_data, +- pdu->transport_data_length); +- if (!snmp_strcat +- (&temp_buf, &temp_buf_len, &temp_out_len, 1, (u_char *)tstr)) { +- if (tstr != NULL) { +- free(tstr); +- } +- if (temp_buf != NULL) { +- free(temp_buf); +- } ++ if (transport != NULL && transport->f_fmtaddr != NULL) { ++ oflags = transport->flags; ++ if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, ++ NETSNMP_DS_APP_NUMERIC_IP)) ++ transport->flags |= NETSNMP_TRANSPORT_FLAG_HOSTNAME; ++ tstr = transport->f_fmtaddr(transport, pdu->transport_data, ++ pdu->transport_data_length); ++ transport->flags = oflags; ++ ++ if (!tstr) goto nohost; ++ if (!snmp_strcat(&temp_buf, &temp_buf_len, &temp_out_len, ++ 1, (u_char *)tstr)) { ++ SNMP_FREE(temp_buf); ++ SNMP_FREE(tstr); + return 0; + } +- if (tstr != NULL) { +- free(tstr); +- } ++ SNMP_FREE(tstr); + } else { +- /* +- * We are kind of stuck! +- */ ++nohost: + if (!snmp_strcat(&temp_buf, &temp_buf_len, &temp_out_len, 1, +- "")) { +- if (temp_buf != NULL) { +- free(temp_buf); +- } ++ (const u_char*)"")) { ++ SNMP_FREE(temp_buf); + return 0; + } + } +--- net-snmp-5.4/snmplib/snmpUDPDomain.c.orig 2006-09-20 01:42:17.000000000 +0200 ++++ net-snmp-5.4/snmplib/snmpUDPDomain.c 2007-05-03 12:17:30.000000000 +0200 +@@ -87,6 +87,7 @@ + netsnmp_udp_fmtaddr(netsnmp_transport *t, void *data, int len) + { + netsnmp_udp_addr_pair *addr_pair = NULL; ++ struct hostent *host; + + if (data != NULL && len == sizeof(netsnmp_udp_addr_pair)) { + addr_pair = (netsnmp_udp_addr_pair *) data; +@@ -104,6 +105,10 @@ + return strdup("UDP: unknown"); + } + ++ if ( t && t->flags & NETSNMP_TRANSPORT_FLAG_HOSTNAME ) { ++ host = gethostbyaddr((char *)&to->sin_addr, 4, AF_INET); ++ return (host ? strdup(host->h_name) : NULL); ++ } + sprintf(tmp, "UDP: [%s]:%hu", + inet_ntoa(to->sin_addr), ntohs(to->sin_port)); + return strdup(tmp); +--- net-snmp-5.3.1/include/net-snmp/library/snmp_transport.h.orig 2005-09-15 15:46:58.000000000 +0200 ++++ net-snmp-5.3.1/include/net-snmp/library/snmp_transport.h 2007-05-02 17:21:30.000000000 +0200 +@@ -19,6 +19,7 @@ + #define NETSNMP_TRANSPORT_FLAG_STREAM 0x01 + #define NETSNMP_TRANSPORT_FLAG_LISTEN 0x02 + #define NETSNMP_TRANSPORT_FLAG_TUNNELED 0x04 ++#define NETSNMP_TRANSPORT_FLAG_HOSTNAME 0x80 /* for fmtaddr hook */ + + /* The standard SNMP domains. */ + diff --git a/net-snmp-5.4-udp-endpoint.patch b/net-snmp-5.4-udp-endpoint.patch new file mode 100644 index 0000000..a473035 --- /dev/null +++ b/net-snmp-5.4-udp-endpoint.patch @@ -0,0 +1,12 @@ +Already fixed upstream, should appear in 5.4.1 +--- net-snmp-5.4/agent/mibgroup/udp-mib/data_access/udp_endpoint_linux.c.orig 2006-09-19 05:26:57.000000000 +0200 ++++ net-snmp-5.4/agent/mibgroup/udp-mib/data_access/udp_endpoint_linux.c 2007-05-03 13:21:55.000000000 +0200 +@@ -194,7 +194,7 @@ + offset, line_info->start)); + return PMLP_RC_MEMORY_UNUSED; + } +- ep->loc_addr_len = offset; ++ ep->rmt_addr_len = offset; + ptr += (offset * 2); + ++ptr; /* skip ':' */ + diff --git a/net-snmp.spec b/net-snmp.spec index 0ff64a8..b7c852d 100644 --- a/net-snmp.spec +++ b/net-snmp.spec @@ -38,6 +38,10 @@ Patch13: net-snmp-5.4-ethtool-config.patch Patch14: net-snmp-5.4-free.patch Patch15: net-snmp-5.4-strange_libpath.patch Patch16: net-snmp-5.4-snmpassert.patch +Patch17: net-snmp-5.4-hostname.patch +Patch18: net-snmp-5.4-udp-endpoint.patch +Patch19: net-snmp-5.3.1-shared-ip.patch +Patch20: net-snmp-5.3.1-mib-option.patch Requires(pre): /sbin/chkconfig Requires(post): /sbin/chkconfig @@ -155,6 +159,11 @@ and applications. %patch15 -p1 -b .strange_libpath %patch16 -p1 -b .verboselog +%patch17 -p1 -b .hostname +%patch18 -p1 -b .udp-endpoint +%patch19 -p1 -b .shared-ip +%patch20 -p1 -b .mib-option + # Do this patch with a perl hack... perl -pi -e "s|'\\\$install_libdir'|'%{_libdir}'|" ltmain.sh @@ -358,6 +367,11 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/lib*.so.* %changelog +* Thu May 3 2007 Jan Safranek +- fix snmptrapd hostname logging (#238587) +- fix udpEndpointProcess remote IP address (#236551) +- fix -M option of net-snmp-utils (#244784) + * Mon Mar 12 2007 Radek Vokál - 1:5.4-13 - fix overly verbose log message (#221911) - few minor tweaks for review - still not perfect