From e7dcd6a5407a65664e7fada76fc4bb791080a7b2 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Thu, 22 Jan 2026 02:30:56 +0000 Subject: [PATCH] Fix (attempt) GH-20752: netsnmp_session_init() without system ipv6. - opening up building peername to non ipv6 supported systems. - while at it, inet_ntop should not be called with a query size as large as MAX_NAME_LEN/MAX_OID_LEN but INET6_ADDRSTRLEN max. - checking in case of non ipv6 support (AF_INET6 can be still defined in this case). --- ext/snmp/snmp.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index 0654a97dfc861..f54f4fd99ed43 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -842,6 +842,9 @@ static bool netsnmp_session_init(php_snmp_session **session_p, int version, zend struct sockaddr **res; // TODO: Do not strip and re-add the port in peername? unsigned remote_port = SNMP_PORT; +#if defined(HAVE_GETADDRINFO) + char name[INET6_ADDRSTRLEN]; +#endif *session_p = (php_snmp_session *)emalloc(sizeof(php_snmp_session)); session = *session_p; @@ -888,18 +891,17 @@ static bool netsnmp_session_init(php_snmp_session **session_p, int version, zend res = psal; while (n-- > 0) { pptr = session->peername; -#if defined(HAVE_GETADDRINFO) && defined(HAVE_IPV6) +#if defined(HAVE_GETADDRINFO) if (force_ipv6 && (*res)->sa_family != AF_INET6) { res++; continue; } if ((*res)->sa_family == AF_INET6) { - strcpy(session->peername, "udp6:["); - pptr = session->peername + strlen(session->peername); - inet_ntop((*res)->sa_family, &(((struct sockaddr_in6*)(*res))->sin6_addr), pptr, MAX_NAME_LEN); - strcat(pptr, "]"); + if (inet_ntop((*res)->sa_family, &(((struct sockaddr_in6*)(*res))->sin6_addr), name, sizeof(name))) { + snprintf(pptr, MAX_NAME_LEN, "udp6:[%s]", name); + } } else if ((*res)->sa_family == AF_INET) { - inet_ntop((*res)->sa_family, &(((struct sockaddr_in*)(*res))->sin_addr), pptr, MAX_NAME_LEN); + inet_ntop((*res)->sa_family, &(((struct sockaddr_in*)(*res))->sin_addr), pptr, INET_ADDRSTRLEN); } else { res++; continue;