Blame SOURCES/net-snmp-5.8-double-IP-parsing.patch

6af263
From 1bb941d6fcd7ac2db5a54b95ee0ed07ec9861e70 Mon Sep 17 00:00:00 2001
6af263
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?= <jridky@redhat.com>
6af263
Date: Fri, 12 Mar 2021 10:15:30 +0100
6af263
Subject: [PATCH] Prevent parsing IP address twice (#199)
6af263
6af263
This fixes issue, that is caused by parsing IP address twice.
6af263
First as IPv4 and as IPv6 at second, even thow the address was
6af263
properly parsed as a valid IPv4 address.
6af263
---
6af263
 snmplib/transports/snmpUDPDomain.c     |  2 +-
6af263
 snmplib/transports/snmpUDPIPv6Domain.c | 10 +++++++++-
6af263
 2 files changed, 10 insertions(+), 2 deletions(-)
6af263
6af263
diff --git a/snmplib/transports/snmpUDPDomain.c b/snmplib/transports/snmpUDPDomain.c
6af263
index b96497f3a3..b594a389b9 100644
6af263
--- a/snmplib/transports/snmpUDPDomain.c
6af263
+++ b/snmplib/transports/snmpUDPDomain.c
6af263
@@ -387,7 +387,7 @@ netsnmp_udp_parse_security(const char *token, char *param)
6af263
             /* Nope, wasn't a dotted quad.  Must be a hostname. */
6af263
             int ret = netsnmp_gethostbyname_v4(sourcep, &network.s_addr);
6af263
             if (ret < 0) {
6af263
-                config_perror("cannot resolve source hostname");
6af263
+                config_perror("cannot resolve IPv4 source hostname");
6af263
                 return;
6af263
             }
6af263
         }
6af263
diff --git a/snmplib/transports/snmpUDPIPv6Domain.c b/snmplib/transports/snmpUDPIPv6Domain.c
6af263
index 238c8a9d63..7db19c5c02 100644
6af263
--- a/snmplib/transports/snmpUDPIPv6Domain.c
6af263
+++ b/snmplib/transports/snmpUDPIPv6Domain.c
6af263
@@ -736,7 +736,15 @@ netsnmp_udp6_parse_security(const char *token, char *param)
6af263
                 memset(&pton_addr.sin6_addr.s6_addr, '\0',
6af263
                        sizeof(struct in6_addr));
6af263
             } else if (inet_pton(AF_INET6, sourcep, &pton_addr.sin6_addr) != 1) {
6af263
-                /* Nope, wasn't a numeric address. Must be a hostname. */
6af263
+                /* Nope, wasn't a numeric IPv6 address. Must be IPv4 or a hostname. */
6af263
+
6af263
+                /* Try interpreting as dotted quad - IPv4 */
6af263
+                struct in_addr network;
6af263
+                if (inet_pton(AF_INET, sourcep, &network) > 0){
6af263
+                    /* Yes, it's IPv4 - so it's already parsed and we can return. */
6af263
+                    DEBUGMSGTL(("com2sec6", "IPv4 detected for IPv6 parser. Skipping.\n"));
6af263
+                    return;
6af263
+                }
6af263
 #if HAVE_GETADDRINFO
6af263
                 int             gai_error;
6af263
 
6af263