]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
Use getnameinfo(3) instead of our own equivalent
authorAlejandro Colomar <alx@kernel.org>
Thu, 19 Jan 2023 18:33:53 +0000 (19:33 +0100)
committerSerge Hallyn <serge@hallyn.com>
Fri, 20 Jan 2023 16:23:03 +0000 (10:23 -0600)
I didn't know getnameinfo(3) existed, so I implemented it, or something
similar to it called inet_sockaddr2str().  Let's use the standard API.

Link: <https://inbox.sourceware.org/libc-alpha/0f25d60f-f183-b518-b6c1-6d46aa63ee57@gmail.com/T/>
Link: <https://stackoverflow.com/a/42190913/6872717>
Link: <https://github.com/shadow-maint/shadow/pull/617>
Link: <https://software.codidact.com/posts/287748>
Cc: Zack Weinberg <zack@owlfolio.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
lib/prototypes.h
libmisc/Makefile.am
libmisc/inet_sockaddr2str.c [deleted file]
src/login_nopam.c

index 066252c6e705e6816399dfafaa4da346030e7972..49e3db53ff410e42786604ca4560cc21315f82d7 100644 (file)
@@ -194,9 +194,6 @@ extern bool gr_append_member (struct group *grp, char *member);
 /* hushed.c */
 extern bool hushed (const char *username);
 
-/* inet_sockaddr2str.c */
-extern const char *inet_sockaddr2str(const struct sockaddr *sa);
-
 /* audit_help.c */
 #ifdef WITH_AUDIT
 extern int audit_fd;
index 5484c8a5d3a41d893cc3d1a16276f8cd69355e19..c2277a02343e34820d6ff68f3a1ad2dee20ff14e 100644 (file)
@@ -38,7 +38,6 @@ libmisc_la_SOURCES = \
        hushed.c \
        idmapping.h \
        idmapping.c \
-       inet_sockaddr2str.c \
        isexpired.c \
        limits.c \
        list.c log.c \
diff --git a/libmisc/inet_sockaddr2str.c b/libmisc/inet_sockaddr2str.c
deleted file mode 100644 (file)
index ce7466c..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2022, Alejandro Colomar <alx@kernel.org>
- *
- * SPDX-License-Identifier:  BSD-3-Clause
- */
-
-#include <config.h>
-
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/in.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#ident "$Id$"
-
-#include "defines.h"
-#include "prototypes.h"
-
-
-#if !defined(INET_ADDRSTRLENMAX)
-#define INET_ADDRSTRLENMAX  MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)
-#endif
-
-
-/*
- * SYNOPSIS
- *     const char *inet_sockaddr2str(const struct sockaddr *sa);
- *
- * DESCRIPTION
- *     This function is similar to inet_ntop(3).  It transforms an address
- *     in 'struct in_addr' or 'struct in6_addr' form into a human-readable
- *     string.
- *
- *     It receives a sockaddr structure, which is simpler to pass after
- *     receiving it from getaddrinfo(3).  However, this function is not
- *     reentrant, and like inet_ntoa(3), it uses an internal buffer, for
- *     simplicity; anyway we're not in a multithreaded program, and it
- *     doesn't contain any sensitive data, so it's fine to use static
- *     storage here.
- *
- * RETURN VALUE
- *     This function returns a pointer to a statically allocated buffer,
- *     which subsequent calls will overwrite.
- *
- *     On error, it returns NULL.
- *
- * ERRORS
- *     EAFNOSUPPORT
- *             The address family in sa->sa_family is not AF_INET or AF_INET6.
- *
- * CAVEATS
- *     This function is not reentrant.
- */
-
-
-const char *
-inet_sockaddr2str(const struct sockaddr *sa)
-{
-       struct sockaddr_in   *sin;
-       struct sockaddr_in6  *sin6;
-
-       static char          buf[INET_ADDRSTRLENMAX];
-
-       switch (sa->sa_family) {
-       case AF_INET:
-               sin = (struct sockaddr_in *) sa;
-               inet_ntop(AF_INET, &sin->sin_addr, buf, NITEMS(buf));
-               return buf;
-       case AF_INET6:
-               sin6 = (struct sockaddr_in6 *) sa;
-               inet_ntop(AF_INET6, &sin6->sin6_addr, buf, NITEMS(buf));
-               return buf;
-       default:
-               errno = EAFNOSUPPORT;
-               return NULL;
-       }
-}
index 72743b39066aba39cfc98e5fdd234439d065d69f..b09cffe4a6fe60d25026b31a45aef069b0cd455c 100644 (file)
@@ -267,22 +267,24 @@ static const char *resolve_hostname (const char *string)
        char             *addr_str;
        struct addrinfo  *addrs;
 
+       static char      host[MAXHOSTNAMELEN];
+
        gai_err = getaddrinfo(string, NULL, NULL, &addrs);
-       if (gai_err != 0)
-               goto notfound;
+       if (gai_err != 0) {
+               SYSLOG ((LOG_ERR, "getaddrinfo(%s): %s", string, gai_strerror(gai_err)));
+               return string;
+       }
 
-       addr_str = inet_sockaddr2str(addrs[0].ai_addr);
-       if (addr_str == NULL) {
-               SYSLOG ((LOG_ERR, "inet_sockaddr2str(): %s", strerror(errno)));
-               abort();
+       addr_str = host;
+       gai_err = getnameinfo(addrs[0].ai_addr, addrs[0].ai_addrlen,
+                             host, NITEMS(host), NULL, 0, NI_NUMERICHOST);
+       if (gai_err != 0) {
+               SYSLOG ((LOG_ERR, "getnameinfo(%s): %s", string, gai_strerror(gai_err)));
+               addr_str = string;
        }
 
        freeaddrinfo(addrs);
        return addr_str;
-
-notfound:
-       SYSLOG ((LOG_ERR, "getaddrinfo(%s): %s", string, gai_strerror(gai_err)));
-       return string;
 }
 
 /* from_match - match a host or tty against a list of tokens */