From 3cb07d9c440d7bf0c4f8877a68a8d7467b97a238 Mon Sep 17 00:00:00 2001 From: David King Date: Mon, 6 Jun 2022 17:30:40 +0100 Subject: [PATCH] Avoid some deprecated networking functions rpminspect trips up on some old networking functions in libgtop, which are mentioned as deprecated in the Linux man pages. inet_ntoa() only works on IPv4 addresses, whereas the newer inet_ntop() works on both IPv4 and IPv6 addresses, so use inet_ntop() instead. Similarly, use getaddrinfo() rather than gethostbyname(), and avoid inet_addr() entirely. https://bugzilla.redhat.com/show_bug.cgi?id=2050712 --- examples/netload.c | 10 +++------- src/daemon/gnuserv.c | 20 ++++++++++++++------ sysdeps/common/gnuslib.c | 16 ++++++++++------ 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/examples/netload.c b/examples/netload.c index 979b245d..520b5040 100644 --- a/examples/netload.c +++ b/examples/netload.c @@ -66,7 +66,7 @@ main (int argc, char *argv []) glibtop_netload netload; unsigned method, count, port; struct in_addr addr, subnet; - char *address_string, *subnet_string; + char address_string[INET_ADDRSTRLEN], subnet_string[INET_ADDRSTRLEN]; char address6_string[INET6_ADDRSTRLEN], prefix6_string[INET6_ADDRSTRLEN]; char *hwaddress_string; char buffer [BUFSIZ]; @@ -105,9 +105,8 @@ main (int argc, char *argv []) addr.s_addr = netload.address; subnet.s_addr = netload.subnet; - address_string = g_strdup (inet_ntoa (addr)); - subnet_string = g_strdup (inet_ntoa (subnet)); - + inet_ntop (AF_INET, &addr, address_string, INET_ADDRSTRLEN); + inet_ntop (AF_INET, &subnet, subnet_string, INET_ADDRSTRLEN); inet_ntop (AF_INET6, netload.address6, address6_string, INET6_ADDRSTRLEN); inet_ntop (AF_INET6, netload.prefix6, prefix6_string, INET6_ADDRSTRLEN); @@ -153,9 +152,6 @@ main (int argc, char *argv []) hwaddress_string); - g_free (address_string); - g_free (subnet_string); - glibtop_close (); exit (0); diff --git a/src/daemon/gnuserv.c b/src/daemon/gnuserv.c index 78ebb643..26e9dd92 100644 --- a/src/daemon/gnuserv.c +++ b/src/daemon/gnuserv.c @@ -392,6 +392,7 @@ handle_internet_request (int ls) int s; size_t addrlen = sizeof (struct sockaddr_in); struct sockaddr_in peer; /* for peer socket address */ + char addrstr[addrlen]; pid_t pid; memset ((char *) &peer, 0, sizeof (struct sockaddr_in)); @@ -401,21 +402,24 @@ handle_internet_request (int ls) exit (1); } + /* TODO: Check errno. */ + inet_ntop (AF_INET, &peer, addrstr, addrlen); + if (verbose_output) syslog_message (LOG_INFO, "Connection was made from %s port %u.", - inet_ntoa (peer.sin_addr), ntohs (peer.sin_port)); + addrstr, ntohs (peer.sin_port)); /* Check that access is allowed - if not return crud to the client */ if (!permitted (peer.sin_addr.s_addr, s)) { close (s); syslog_message (LOG_CRIT, "Refused connection from %s.", - inet_ntoa (peer.sin_addr)); + addrstr); return; } /* if */ if (verbose_output) syslog_message (LOG_INFO, "Accepted connection from %s port %u.", - inet_ntoa (peer.sin_addr), ntohs (peer.sin_port)); + addrstr, ntohs (peer.sin_port)); pid = fork (); @@ -436,7 +440,7 @@ handle_internet_request (int ls) if (verbose_output) syslog_message (LOG_INFO, "Closed connection to %s port %u.", - inet_ntoa (peer.sin_addr), ntohs (peer.sin_port)); + addrstr, ntohs (peer.sin_port)); _exit (0); } /* handle_internet_request */ @@ -560,6 +564,7 @@ main (int argc, char **argv) if (invoked_from_inetd) { size_t addrlen = sizeof (struct sockaddr_in); struct sockaddr_in peer; + char addrstr[addrlen]; memset ((char *) &peer, 0, sizeof (struct sockaddr_in)); @@ -568,15 +573,18 @@ main (int argc, char **argv) exit (1); } + /* TODO: Check errno. */ + inet_ntop (AF_INET, &peer, addrstr, addrlen); + if (verbose_output) syslog_message (LOG_INFO, "Connection was made from %s port %u.", - inet_ntoa (peer.sin_addr), ntohs (peer.sin_port)); + addrstr, ntohs (peer.sin_port)); /* Check that access is allowed - if not return crud to the client */ if (!permitted (peer.sin_addr.s_addr, 0)) { close (0); syslog_message (LOG_CRIT, "Refused connection from %s.", - inet_ntoa (peer.sin_addr)); + addrstr); exit (1); } diff --git a/sysdeps/common/gnuslib.c b/sysdeps/common/gnuslib.c index 79295485..3f994f2c 100644 --- a/sysdeps/common/gnuslib.c +++ b/sysdeps/common/gnuslib.c @@ -202,16 +202,20 @@ connect_to_unix_server (void) long glibtop_internet_addr (const char *host) { - struct hostent *hp; /* pointer to host info for remote host */ + /* specify IPv4 and TCP */ + struct addrinfo hints = { AF_INET, SOCK_STREAM, }; + struct addrinfo *result;/* pointer to host info for remote host */ IN_ADDR numeric_addr; /* host address */ - numeric_addr = inet_addr (host); - if (!NUMERIC_ADDR_ERROR) + if (getaddrinfo (NULL, host, &hints, &result) == 0) { + /* Take only the first address. */ + struct sockaddr_in *res = (struct sockaddr_in *)result->ai_addr; + numeric_addr = res->sin_addr.s_addr; + freeaddrinfo (result); return numeric_addr; - else if ((hp = gethostbyname (host)) != NULL) - return ((struct in_addr *) (hp->h_addr))->s_addr; + } else { - glibtop_warn_io ("gethostbyname (%s)", host); + glibtop_warn_io ("getaddrinfo (%s)", host); return -1; } -- 2.36.1