From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D491C43381 for ; Wed, 27 Feb 2019 16:50:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0C35C206B8 for ; Wed, 27 Feb 2019 16:50:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726122AbfB0QuG (ORCPT ); Wed, 27 Feb 2019 11:50:06 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54870 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725854AbfB0QuF (ORCPT ); Wed, 27 Feb 2019 11:50:05 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2A577309E97B; Wed, 27 Feb 2019 16:50:05 +0000 (UTC) Received: from madhat.home.dicksonnet.net (ovpn-118-12.phx2.redhat.com [10.3.118.12]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7D7B616900; Wed, 27 Feb 2019 16:50:04 +0000 (UTC) Subject: Re: [PATCH v2] nfs-utils: fix addrinfo usage with musl-1.1.21 To: Peter Wagner , Chuck Lever , linux-nfs@vger.kernel.org References: <20190219200333.4782a656@onion.lan> From: Steve Dickson Message-ID: Date: Wed, 27 Feb 2019 11:50:04 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.1 MIME-Version: 1.0 In-Reply-To: <20190219200333.4782a656@onion.lan> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Wed, 27 Feb 2019 16:50:05 +0000 (UTC) Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On 2/19/19 2:03 PM, Peter Wagner wrote: > From 877184f733d13d7db0ec9265a53ede9c30d03ba4 Mon Sep 17 00:00:00 2001 > From: Peter Wagner > Date: Tue, 19 Feb 2019 20:00:22 +0100 > Subject: [PATCH] [PATCH] define and use wrapper function nfs_freeaddrinfo to > handle freeaddrinfo versions that don't tolerate NULL pointers > > Signed-off-by: Peter Wagner Committed... steved. > --- > support/export/client.c | 6 +++--- > support/export/hostname.c | 4 ++-- > support/include/exportfs.h | 11 +++++++++++ > support/nfs/getport.c | 7 ++++--- > support/nfs/svc_create.c | 8 +++++--- > support/nfsidmap/umich_ldap.c | 2 +- > tests/nsm_client/nsm_client.c | 2 +- > utils/exportfs/exportfs.c | 10 +++++----- > utils/gssd/gssd.c | 4 ++-- > utils/gssd/krb5_util.c | 2 +- > utils/mount/network.c | 7 ++++--- > utils/mount/stropts.c | 3 ++- > utils/mountd/auth.c | 2 +- > utils/mountd/cache.c | 10 +++++----- > utils/mountd/mountd.c | 4 ++-- > utils/mountd/rmtab.c | 2 +- > utils/nfsd/nfssvc.c | 4 ++-- > utils/statd/hostname.c | 11 ++++++----- > utils/statd/sm-notify.c | 14 +++++++------- > 19 files changed, 65 insertions(+), 48 deletions(-) > > diff --git a/support/export/client.c b/support/export/client.c > index baf59c8..a1fba01 100644 > --- a/support/export/client.c > +++ b/support/export/client.c > @@ -210,7 +210,7 @@ init_subnetwork(nfs_client *clp) > set_addrlist(clp, 0, ai->ai_addr); > family = ai->ai_addr->sa_family; > > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > > switch (family) { > case AF_INET: > @@ -309,7 +309,7 @@ client_lookup(char *hname, int canonical) > init_addrlist(clp, ai); > > out: > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > return clp; > } > > @@ -674,7 +674,7 @@ check_netgroup(const nfs_client *clp, const struct addrinfo *ai) > tmp = host_pton(hname); > if (tmp != NULL) { > char *cname = host_canonname(tmp->ai_addr); > - freeaddrinfo(tmp); > + nfs_freeaddrinfo(tmp); > > /* The resulting FQDN may be in our netgroup. */ > if (cname != NULL) { > diff --git a/support/export/hostname.c b/support/export/hostname.c > index 96c5449..be4d7f6 100644 > --- a/support/export/hostname.c > +++ b/support/export/hostname.c > @@ -130,7 +130,7 @@ host_pton(const char *paddr) > if (!inet4 && ai->ai_addr->sa_family == AF_INET) { > xlog(D_GENERAL, "%s: failed to convert %s", > __func__, paddr); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > break; > } > return ai; > @@ -292,7 +292,7 @@ host_reliable_addrinfo(const struct sockaddr *sap) > if (nfs_compare_sockaddr(a->ai_addr, sap)) > break; > > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > ai = NULL; > if (!a) > goto out; > diff --git a/support/include/exportfs.h b/support/include/exportfs.h > index 4e0d9d1..b81f963 100644 > --- a/support/include/exportfs.h > +++ b/support/include/exportfs.h > @@ -47,6 +47,17 @@ typedef struct mclient { > int m_count; > } nfs_client; > > +/* > + * Some versions of freeaddrinfo(3) do not tolerate being > + * passed a NULL pointer. > + */ > +static inline void nfs_freeaddrinfo(struct addrinfo *ai) > +{ > + if (ai) { > + freeaddrinfo(ai); > + } > +} > + > static inline const struct sockaddr * > get_addrlist(const nfs_client *clp, const int i) > { > diff --git a/support/nfs/getport.c b/support/nfs/getport.c > index 081594c..26ec85e 100644 > --- a/support/nfs/getport.c > +++ b/support/nfs/getport.c > @@ -47,6 +47,7 @@ > > #include "sockaddr.h" > #include "nfsrpc.h" > +#include "exportfs.h" > > /* > * Try a local socket first to access the local rpcbind daemon > @@ -109,7 +110,7 @@ static int nfs_gp_loopback_address(struct sockaddr *sap, socklen_t *salen) > ret = 1; > } > > - freeaddrinfo(gai_results); > + nfs_freeaddrinfo(gai_results); > return ret; > } > > @@ -134,8 +135,8 @@ static in_port_t nfs_gp_getservbyname(const char *service, > > sin = (const struct sockaddr_in *)gai_results->ai_addr; > port = sin->sin_port; > - > - freeaddrinfo(gai_results); > + > + nfs_freeaddrinfo(gai_results); > return port; > } > > diff --git a/support/nfs/svc_create.c b/support/nfs/svc_create.c > index ef7ff05..d0b747b 100644 > --- a/support/nfs/svc_create.c > +++ b/support/nfs/svc_create.c > @@ -39,6 +39,8 @@ > #include > #include > > +#include "exportfs.h" > + > #ifdef HAVE_TCP_WRAPPER > #include "tcpwrapper.h" > #endif > @@ -273,7 +275,7 @@ svc_create_nconf_rand_port(const char *name, const rpcprog_t program, > bindaddr.qlen = SOMAXCONN; > > xprt = svc_tli_create(RPC_ANYFD, nconf, &bindaddr, 0, 0); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > if (xprt == NULL) { > xlog(L_ERROR, "Failed to create listener xprt " > "(%s, %u, %s)", name, version, nconf->nc_netid); > @@ -364,11 +366,11 @@ svc_create_nconf_fixed_port(const char *name, const rpcprog_t program, > > svc_create_cache_xprt(xprt); > > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > return 1; > > out_free: > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > return 0; > } > > diff --git a/support/nfsidmap/umich_ldap.c b/support/nfsidmap/umich_ldap.c > index b661110..b8ee184 100644 > --- a/support/nfsidmap/umich_ldap.c > +++ b/support/nfsidmap/umich_ldap.c > @@ -1089,7 +1089,7 @@ get_canonical_hostname(const char *inname) > return_name = strdup (tmphost); > > out_free: > - freeaddrinfo(ap); > + nfs_freeaddrinfo(ap); > out_err: > return return_name; > } > diff --git a/tests/nsm_client/nsm_client.c b/tests/nsm_client/nsm_client.c > index 0fa3422..8dc0591 100644 > --- a/tests/nsm_client/nsm_client.c > +++ b/tests/nsm_client/nsm_client.c > @@ -243,7 +243,7 @@ nsm_client_get_rpcclient(const char *node) > printf("RPC client creation failed\n"); > } > out: > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > return client; > } > > diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c > index cd3c979..333eadc 100644 > --- a/utils/exportfs/exportfs.c > +++ b/utils/exportfs/exportfs.c > @@ -282,7 +282,7 @@ exportfs_parsed(char *hname, char *path, char *options, int verbose) > validate_export(exp); > > out: > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > } > > static int exportfs_generic(char *arg, char *options, int verbose) > @@ -395,7 +395,7 @@ unexportfs_parsed(char *hname, char *path, int verbose) > if (!success) > xlog(L_ERROR, "Could not find '%s:%s' to unexport.", hname, path); > > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > } > > static int unexportfs_generic(char *arg, int verbose) > @@ -588,7 +588,7 @@ address_list(const char *hostname) > if (ai != NULL) { > /* @hostname was a presentation address */ > cname = host_canonname(ai->ai_addr); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > if (cname != NULL) > goto out; > } > @@ -639,8 +639,8 @@ matchhostname(const char *hostname1, const char *hostname2) > } > > out: > - freeaddrinfo(results1); > - freeaddrinfo(results2); > + nfs_freeaddrinfo(results1); > + nfs_freeaddrinfo(results2); > return result; > } > > diff --git a/utils/gssd/gssd.c b/utils/gssd/gssd.c > index 2e92f28..7eeb05f 100644 > --- a/utils/gssd/gssd.c > +++ b/utils/gssd/gssd.c > @@ -172,14 +172,14 @@ gssd_addrstr_to_sockaddr(struct sockaddr *sa, const char *node, const char *port > if (sin6->sin6_scope_id) { > printerr(0, "ERROR: address %s has non-zero " > "sin6_scope_id!\n", node); > - freeaddrinfo(res); > + nfs_freeaddrinfo(res); > return false; > } > } > #endif /* IPV6_SUPPORTED */ > > memcpy(sa, res->ai_addr, res->ai_addrlen); > - freeaddrinfo(res); > + nfs_freeaddrinfo(res); > return true; > } > > diff --git a/utils/gssd/krb5_util.c b/utils/gssd/krb5_util.c > index eba1aac..adbde93 100644 > --- a/utils/gssd/krb5_util.c > +++ b/utils/gssd/krb5_util.c > @@ -587,7 +587,7 @@ get_full_hostname(const char *inhost, char *outhost, int outhostlen) > goto out; > } > strncpy(outhost, addrs->ai_canonname, outhostlen); > - freeaddrinfo(addrs); > + nfs_freeaddrinfo(addrs); > for (c = outhost; *c != '\0'; c++) > *c = tolower(*c); > > diff --git a/utils/mount/network.c b/utils/mount/network.c > index 356f663..fcb0b9f 100644 > --- a/utils/mount/network.c > +++ b/utils/mount/network.c > @@ -53,6 +53,7 @@ > #include > #include > > +#include "exportfs.h" > #include "sockaddr.h" > #include "xcommon.h" > #include "mount.h" > @@ -250,7 +251,7 @@ int nfs_lookup(const char *hostname, const sa_family_t family, > break; > } > > - freeaddrinfo(gai_results); > + nfs_freeaddrinfo(gai_results); > return ret; > } > > @@ -307,7 +308,7 @@ int nfs_string_to_sockaddr(const char *address, struct sockaddr *sap, > } > break; > } > - freeaddrinfo(gai_results); > + nfs_freeaddrinfo(gai_results); > } > > return ret; > @@ -1180,7 +1181,7 @@ static int nfs_ca_gai(const struct sockaddr *sap, > *buflen = gai_results->ai_addrlen; > memcpy(buf, gai_results->ai_addr, *buflen); > > - freeaddrinfo(gai_results); > + nfs_freeaddrinfo(gai_results); > > return 1; > } > diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c > index 0a25b1f..b170552 100644 > --- a/utils/mount/stropts.c > +++ b/utils/mount/stropts.c > @@ -35,6 +35,7 @@ > #include > #include > > +#include "exportfs.h" > #include "sockaddr.h" > #include "xcommon.h" > #include "mount.h" > @@ -1268,7 +1269,7 @@ int nfsmount_string(const char *spec, const char *node, char *type, > } else > nfs_error(_("%s: internal option parsing error"), progname); > > - freeaddrinfo(mi.address); > + nfs_freeaddrinfo(mi.address); > free(mi.hostname); > return retval; > } > diff --git a/utils/mountd/auth.c b/utils/mountd/auth.c > index cb4848c..67627f7 100644 > --- a/utils/mountd/auth.c > +++ b/utils/mountd/auth.c > @@ -297,7 +297,7 @@ auth_authenticate(const char *what, const struct sockaddr *caller, > what, buf, nfs_get_port(caller), path, epath, error); > } > > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > return exp; > } > > diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c > index 7e8d403..2cb370f 100644 > --- a/utils/mountd/cache.c > +++ b/utils/mountd/cache.c > @@ -113,7 +113,7 @@ static void auth_unix_ip(int f) > ai = client_resolve(tmp->ai_addr); > if (ai) { > client = client_compose(ai); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > } > } > bp = buf; blen = sizeof(buf); > @@ -133,7 +133,7 @@ static void auth_unix_ip(int f) > xlog(D_CALL, "auth_unix_ip: client %p '%s'", client, client?client: "DEFAULT"); > > free(client); > - freeaddrinfo(tmp); > + nfs_freeaddrinfo(tmp); > > } > > @@ -667,7 +667,7 @@ static struct addrinfo *lookup_client_addr(char *dom) > if (tmp == NULL) > return NULL; > ret = client_resolve(tmp->ai_addr); > - freeaddrinfo(tmp); > + nfs_freeaddrinfo(tmp); > return ret; > } > > @@ -834,7 +834,7 @@ static void nfsd_fh(int f) > out: > if (found_path) > free(found_path); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > free(dom); > xlog(D_CALL, "nfsd_fh: found %p path %s", found, found ? found->e_path : NULL); > } > @@ -1355,7 +1355,7 @@ static void nfsd_export(int f) > xlog(D_CALL, "nfsd_export: found %p path %s", found, path ? path : NULL); > if (dom) free(dom); > if (path) free(path); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > } > > > diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c > index 086c39b..fb7bba4 100644 > --- a/utils/mountd/mountd.c > +++ b/utils/mountd/mountd.c > @@ -578,10 +578,10 @@ static void prune_clients(nfs_export *exp, struct exportnode *e) > *cp = c->gr_next; > xfree(c->gr_name); > xfree(c); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > continue; > } > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > } > cp = &(c->gr_next); > } > diff --git a/utils/mountd/rmtab.c b/utils/mountd/rmtab.c > index 3ae0dbb..c896243 100644 > --- a/utils/mountd/rmtab.c > +++ b/utils/mountd/rmtab.c > @@ -226,7 +226,7 @@ mountlist_list(void) > ai = host_pton(rep->r_client); > if (ai != NULL) { > m->ml_hostname = host_canonname(ai->ai_addr); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > } > } > if (m->ml_hostname == NULL) > diff --git a/utils/nfsd/nfssvc.c b/utils/nfsd/nfssvc.c > index 1e6ffd6..47b1882 100644 > --- a/utils/nfsd/nfssvc.c > +++ b/utils/nfsd/nfssvc.c > @@ -25,6 +25,7 @@ > #include "nfslib.h" > #include "xlog.h" > #include "nfssvc.h" > +#include "exportfs.h" > #include "../mount/version.h" > > #ifndef NFSD_FS_DIR > @@ -246,8 +247,7 @@ error: > close(fd); > if (sockfd >= 0) > close(sockfd); > - if (addrhead) > - freeaddrinfo(addrhead); > + nfs_freeaddrinfo(addrhead); > return (bounded ? 0 : rc); > } > > diff --git a/utils/statd/hostname.c b/utils/statd/hostname.c > index 8cccdb8..c9e22d3 100644 > --- a/utils/statd/hostname.c > +++ b/utils/statd/hostname.c > @@ -35,6 +35,7 @@ > #include > #include > > +#include "exportfs.h" > #include "sockaddr.h" > #include "statd.h" > #include "xlog.h" > @@ -203,7 +204,7 @@ statd_canonical_name(const char *hostname) > _Bool result; > result = get_nameinfo(ai->ai_addr, ai->ai_addrlen, > buf, (socklen_t)sizeof(buf)); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > if (!result || buf[0] == '\0') > /* OK to use presentation address, > * if no reverse map exists */ > @@ -217,7 +218,7 @@ statd_canonical_name(const char *hostname) > if (ai == NULL) > return NULL; > strcpy(buf, ai->ai_canonname); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > > return strdup(buf); > } > @@ -253,7 +254,7 @@ statd_canonical_list(const char *hostname) > _Bool result; > result = get_nameinfo(ai->ai_addr, ai->ai_addrlen, > buf, (socklen_t)sizeof(buf)); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > if (result) > goto out; > } > @@ -308,8 +309,8 @@ statd_matchhostname(const char *hostname1, const char *hostname2) > } > > out: > - freeaddrinfo(results2); > - freeaddrinfo(results1); > + nfs_freeaddrinfo(results2); > + nfs_freeaddrinfo(results1); > > xlog(D_CALL, "%s: hostnames %s and %s %s", __func__, > hostname1, hostname2, > diff --git a/utils/statd/sm-notify.c b/utils/statd/sm-notify.c > index 29dad38..05d72a3 100644 > --- a/utils/statd/sm-notify.c > +++ b/utils/statd/sm-notify.c > @@ -37,6 +37,7 @@ > #include "xlog.h" > #include "nsm.h" > #include "nfsrpc.h" > +#include "exportfs.h" > > /* glibc before 2.3.4 */ > #ifndef AI_NUMERICSERV > @@ -179,7 +180,7 @@ smn_verify_my_name(const char *name) > case 0: > /* @name was a presentation address */ > retval = smn_get_hostname(ai->ai_addr, ai->ai_addrlen, name); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > if (retval == NULL) > return NULL; > break; > @@ -253,8 +254,7 @@ static void smn_forget_host(struct nsm_host *host) > free((void *)host->my_name); > free((void *)host->mon_name); > free(host->name); > - if (host->ai) > - freeaddrinfo(host->ai); > + nfs_freeaddrinfo(host->ai); > > free(host); > } > @@ -430,7 +430,7 @@ retry: > if (srcport) { > if (bind(sock, ai->ai_addr, ai->ai_addrlen) == -1) { > xlog(L_ERROR, "Failed to bind RPC socket: %m"); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > (void)close(sock); > return -1; > } > @@ -440,7 +440,7 @@ retry: > if (smn_bindresvport(sock, ai->ai_addr) == -1) { > xlog(L_ERROR, > "bindresvport on RPC socket failed: %m"); > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > (void)close(sock); > return -1; > } > @@ -449,13 +449,13 @@ retry: > se = getservbyport((int)nfs_get_port(ai->ai_addr), "udp"); > if (se != NULL && retry_cnt < 100) { > retry_cnt++; > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > (void)close(sock); > goto retry; > } > } > > - freeaddrinfo(ai); > + nfs_freeaddrinfo(ai); > return sock; > } > >