From efa196a2dd74e6ba177cdf687f34b4feb8a5d482 Mon Sep 17 00:00:00 2001 From: svenper Date: Tue, 16 Apr 2019 01:40:44 +0200 Subject: [PATCH] nfs-utils: update to 2.3.3 --- ...y-do-glibc-specific-hackery-on-glibc.patch | 39 -- .../patches/add-missing-include.patch | 10 - .../patches/fix-HAVE_GETRPCBYNUMBER_R.patch | 27 + .../patches/fix-glibc-sys-sysmacros_h.patch | 25 - .../patches/idmapd-dnotify-to-inotify.patch | 105 ++++ srcpkgs/nfs-utils/patches/limits.patch | 100 +++ srcpkgs/nfs-utils/patches/musl-addrinfo.patch | 576 ++++++++++++++++++ .../nfs-utils/patches/musl-configure_ac.patch | 31 + .../patches/musl-getservbyport.patch | 10 +- srcpkgs/nfs-utils/patches/musl-in6.patch | 29 +- .../patches/musl-svcgssd-sysconf.patch | 103 ++++ .../patches/nfs-utils-1.1.4-mtab-sym.patch | 16 +- srcpkgs/nfs-utils/template | 37 +- srcpkgs/rpcgen | 1 - 14 files changed, 986 insertions(+), 123 deletions(-) delete mode 100644 srcpkgs/nfs-utils/patches/0011-exportfs-only-do-glibc-specific-hackery-on-glibc.patch delete mode 100644 srcpkgs/nfs-utils/patches/add-missing-include.patch create mode 100644 srcpkgs/nfs-utils/patches/fix-HAVE_GETRPCBYNUMBER_R.patch delete mode 100644 srcpkgs/nfs-utils/patches/fix-glibc-sys-sysmacros_h.patch create mode 100644 srcpkgs/nfs-utils/patches/idmapd-dnotify-to-inotify.patch create mode 100644 srcpkgs/nfs-utils/patches/limits.patch create mode 100644 srcpkgs/nfs-utils/patches/musl-addrinfo.patch create mode 100644 srcpkgs/nfs-utils/patches/musl-configure_ac.patch create mode 100644 srcpkgs/nfs-utils/patches/musl-svcgssd-sysconf.patch delete mode 120000 srcpkgs/rpcgen diff --git a/srcpkgs/nfs-utils/patches/0011-exportfs-only-do-glibc-specific-hackery-on-glibc.patch b/srcpkgs/nfs-utils/patches/0011-exportfs-only-do-glibc-specific-hackery-on-glibc.patch deleted file mode 100644 index 6781f69132f..00000000000 --- a/srcpkgs/nfs-utils/patches/0011-exportfs-only-do-glibc-specific-hackery-on-glibc.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0b4df13026eb371b68abc4b8cec4ca8d90c3b0a3 Mon Sep 17 00:00:00 2001 -From: Natanael Copa -Date: Mon, 2 Jun 2014 14:42:10 +0200 -Subject: [PATCH] exportfs: only do glibc specific hackery on glibc - -We should not depend on the libc do free(3) on ai_canonname as that is -completely up to implementation and known o break things on uclibc and -musl libc. - -Signed-off-by: Natanael Copa ---- - support/export/hostname.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/support/export/hostname.c b/support/export/hostname.c -index d9153e1..30584b4 100644 ---- support/export/hostname.c -+++ support/export/hostname.c -@@ -382,6 +382,7 @@ host_numeric_addrinfo(const struct sockaddr *sap) - - ai = host_pton(buf); - -+#if !definded(__UCLIBC__) && defined(__GLIBC__) - /* - * getaddrinfo(AI_NUMERICHOST) never fills in ai_canonname - */ -@@ -392,7 +393,9 @@ host_numeric_addrinfo(const struct sockaddr *sap) - ai = NULL; - } - } -+#endif - - return ai; - } -+ - #endif /* !HAVE_GETNAMEINFO */ --- -2.0.4 - diff --git a/srcpkgs/nfs-utils/patches/add-missing-include.patch b/srcpkgs/nfs-utils/patches/add-missing-include.patch deleted file mode 100644 index cd3a53e07c7..00000000000 --- a/srcpkgs/nfs-utils/patches/add-missing-include.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- support/nsm/rpc.c.orig 2016-08-03 20:25:15.000000000 +0200 -+++ support/nsm/rpc.c 2017-08-26 07:41:11.884000000 +0200 -@@ -40,6 +40,7 @@ - - #include - #include -+#include - #include - #include - #include diff --git a/srcpkgs/nfs-utils/patches/fix-HAVE_GETRPCBYNUMBER_R.patch b/srcpkgs/nfs-utils/patches/fix-HAVE_GETRPCBYNUMBER_R.patch new file mode 100644 index 00000000000..dab817743ff --- /dev/null +++ b/srcpkgs/nfs-utils/patches/fix-HAVE_GETRPCBYNUMBER_R.patch @@ -0,0 +1,27 @@ + svc_socket: fix use of undefined macro HAVE_GETRPCBYNUMBER_R + +The macro HAVE_GETRPCBYNUMBER_R is set based on whether the +`getrpcbynumber_r` function was found by autoconf or not. While another +location correctly checks whether it is set by using `#ifdef`, +`getservport()` instead wrongly uses `#if HAVE_GETRPCBYNUMBER_R`. This +may cause a compilation error with gcc with "-Werror=undef" if the macro +has not been defined. + +Fix the error by using `#ifdef` instead. + +Signed-off-by: Patrick Steinhardt +Signed-off-by: Steve Dickson + +diff --git a/support/nfs/svc_socket.c b/support/nfs/svc_socket.c +index 1239712..d56507a 100644 (file) +--- a/support/nfs/svc_socket.c ++++ b/support/nfs/svc_socket.c +@@ -46,7 +46,7 @@ int getservport(u_long number, const char *proto) + struct rpcent *rpcp; + struct servent servbuf, *servp = NULL; + int ret = 0; +-#if HAVE_GETRPCBYNUMBER_R ++#ifdef HAVE_GETRPCBYNUMBER_R + char rpcdata[1024]; + struct rpcent rpcbuf; + diff --git a/srcpkgs/nfs-utils/patches/fix-glibc-sys-sysmacros_h.patch b/srcpkgs/nfs-utils/patches/fix-glibc-sys-sysmacros_h.patch deleted file mode 100644 index 1c2b2d56416..00000000000 --- a/srcpkgs/nfs-utils/patches/fix-glibc-sys-sysmacros_h.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/utils/blkmapd/device-discovery.c b/utils/blkmapd/device-discovery.c -index 8eb3fd0..746e76f 100644 ---- utils/blkmapd/device-discovery.c -+++ utils/blkmapd/device-discovery.c -@@ -49,6 +49,7 @@ - #include - #include - #include -+#include - - #include "device-discovery.h" - #include "xcommon.h" -diff --git a/utils/blkmapd/dm-device.c b/utils/blkmapd/dm-device.c -index 24ffcbf..d57d4f8 100644 ---- utils/blkmapd/dm-device.c -+++ utils/blkmapd/dm-device.c -@@ -37,6 +37,7 @@ - #include - #include - #include -+#include - - #include "device-discovery.h" - - diff --git a/srcpkgs/nfs-utils/patches/idmapd-dnotify-to-inotify.patch b/srcpkgs/nfs-utils/patches/idmapd-dnotify-to-inotify.patch new file mode 100644 index 00000000000..d1a3011f7f4 --- /dev/null +++ b/srcpkgs/nfs-utils/patches/idmapd-dnotify-to-inotify.patch @@ -0,0 +1,105 @@ +From patchwork Wed Jun 21 21:23:38 2017 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [V2] idmapd: Use inotify instead of dnotify +From: Alan Swanson +X-Patchwork-Id: 9802949 +Message-Id: <20170621212338.32460-1-reiver@improbability.net> +To: linux-nfs@vger.kernel.org +Cc: Alan Swanson +Date: Wed, 21 Jun 2017 22:23:38 +0100 + +Remove last use of dnotify in nfs-utils by bringing idmapd upto +date with (required) inotify use by gssd and blkmapd. +--- + utils/idmapd/idmapd.c | 32 +++++++++++++++++--------------- + 1 file changed, 17 insertions(+), 15 deletions(-) + +Got annoyed by the dnotify kernel requirement. Read the last +discussion "DNOTIFY to INOTIFY migration" posted in 2014 and while +still not officially depreciated, dnotify was officially "replaced" +by inotify in Linux 2.6.13 in 2005. Would be nice to sync this +requirement across the codebase. + +V2: Init wd to -1 not 0 + +diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c +index c12e878..c29dba6 100644 +--- a/utils/idmapd/idmapd.c ++++ b/utils/idmapd/idmapd.c +@@ -36,7 +36,7 @@ + + #include + #include +-#include ++#include + #include + #include + #include +@@ -205,15 +205,16 @@ void usage(char *progname) + int + main(int argc, char **argv) + { +- int fd = 0, opt, fg = 0, nfsdret = -1; ++ int wd = -1, opt, fg = 0, nfsdret = -1; + struct idmap_clientq icq; +- struct event rootdirev, clntdirev, svrdirev; ++ struct event rootdirev, clntdirev, svrdirev, inotifyev; + struct event initialize; + struct passwd *pw; + struct group *gr; + struct stat sb; + char *xpipefsdir = NULL; + int serverstart = 1, clientstart = 1; ++ int inotify_fd; + int ret; + char *progname; + char *conf_path = NULL; +@@ -373,18 +374,15 @@ main(int argc, char **argv) + } + } + +- if ((fd = open(pipefsdir, O_RDONLY)) == -1) +- xlog_err("main: open(%s): %s", pipefsdir, strerror(errno)); +- +- if (fcntl(fd, F_SETSIG, SIGUSR1) == -1) +- xlog_err("main: fcntl(%s): %s", pipefsdir, strerror(errno)); +- +- if (fcntl(fd, F_NOTIFY, +- DN_CREATE | DN_DELETE | DN_MODIFY | DN_MULTISHOT) == -1) { +- xlog_err("main: fcntl(%s): %s", pipefsdir, strerror(errno)); +- if (errno == EINVAL) +- xlog_err("main: Possibly no Dnotify support in kernel."); ++ inotify_fd = inotify_init1(IN_NONBLOCK); ++ if (inotify_fd == -1) { ++ xlog_err("Unable to initialise inotify_init1: %s\n", strerror(errno)); ++ } else { ++ wd = inotify_add_watch(inotify_fd, pipefsdir, IN_CREATE | IN_DELETE | IN_MODIFY); ++ if (wd < 0) ++ xlog_err("Unable to inotify_add_watch(%s): %s\n", pipefsdir, strerror(errno)); + } ++ + TAILQ_INIT(&icq); + + /* These events are persistent */ +@@ -394,6 +392,10 @@ main(int argc, char **argv) + signal_add(&clntdirev, NULL); + signal_set(&svrdirev, SIGHUP, svrreopen, NULL); + signal_add(&svrdirev, NULL); ++ if ( wd >= 0) { ++ event_set(&inotifyev, inotify_fd, EV_READ | EV_PERSIST, dirscancb, &icq); ++ event_add(&inotifyev, NULL); ++ } + + /* Fetch current state */ + /* (Delay till start of event_dispatch to avoid possibly losing +@@ -402,7 +404,7 @@ main(int argc, char **argv) + evtimer_add(&initialize, &now); + } + +- if (nfsdret != 0 && fd == 0) ++ if (nfsdret != 0 && wd < 0) + xlog_err("main: Neither NFS client nor NFSd found"); + + daemon_ready(); diff --git a/srcpkgs/nfs-utils/patches/limits.patch b/srcpkgs/nfs-utils/patches/limits.patch new file mode 100644 index 00000000000..add4014575e --- /dev/null +++ b/srcpkgs/nfs-utils/patches/limits.patch @@ -0,0 +1,100 @@ +--- nfs-utils-2.3.1.orig/support/export/export.c ++++ nfs-utils-2.3.1/support/export/export.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + #include "xmalloc.h" + #include "nfslib.h" + #include "exportfs.h" +--- nfs-utils-2.3.1.orig/support/export/xtab.c ++++ nfs-utils-2.3.1/support/export/xtab.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include "nfslib.h" + #include "exportfs.h" +--- nfs-utils-2.3.1.orig/support/misc/file.c ++++ nfs-utils-2.3.1/support/misc/file.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + + #include "xlog.h" + #include "misc.h" +--- nfs-utils-2.3.1.orig/support/nfs/xcommon.c ++++ nfs-utils-2.3.1/support/nfs/xcommon.c +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + + #include "xcommon.h" + #include "nls.h" /* _() */ +--- nfs-utils-2.3.1.orig/support/nsm/file.c ++++ nfs-utils-2.3.1/support/nsm/file.c +@@ -85,6 +85,7 @@ + #include + #include + #include ++#include + + #include "xlog.h" + #include "nsm.h" +--- nfs-utils-2.3.1.orig/utils/blkmapd/device-discovery.c ++++ nfs-utils-2.3.1/utils/blkmapd/device-discovery.c +@@ -49,6 +49,7 @@ + #include + #include + #include ++#include + #include + + #ifdef HAVE_CONFIG_H +--- nfs-utils-2.3.1.orig/utils/gssd/krb5_util.c ++++ nfs-utils-2.3.1/utils/gssd/krb5_util.c +@@ -120,6 +120,7 @@ + #endif + #include + #include ++#include + + #include "gssd.h" + #include "err_util.h" +--- nfs-utils-2.3.1.orig/utils/mountd/cache.c ++++ nfs-utils-2.3.1/utils/mountd/cache.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include "misc.h" + #include "nfslib.h" + #include "exportfs.h" +--- nfs-utils-2.3.1.orig/utils/mountd/mountd.c ++++ nfs-utils-2.3.1/utils/mountd/mountd.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #include "conffile.h" + #include "xmalloc.h" +--- nfs-utils-2.3.1.orig/utils/mountd/rmtab.c ++++ nfs-utils-2.3.1/utils/mountd/rmtab.c +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + + #include "misc.h" + #include "exportfs.h" diff --git a/srcpkgs/nfs-utils/patches/musl-addrinfo.patch b/srcpkgs/nfs-utils/patches/musl-addrinfo.patch new file mode 100644 index 00000000000..dbef8269e48 --- /dev/null +++ b/srcpkgs/nfs-utils/patches/musl-addrinfo.patch @@ -0,0 +1,576 @@ +From ed06fade6dc46df0a38caab2e465dfaabfc76f46 Mon Sep 17 00:00:00 2001 +From: Peter Wagner +Date: Wed, 20 Feb 2019 10:59:50 -0500 +Subject: [PATCH] nfs-utils: fix addrinfo usage with musl-1.1.21 + +Afer the update to musl 1.1.21 freeaddrinfo is broken in some places in +the nfs-utils code because glibc seems to ignore when freeaddrinfo is +called with a NULL pointer which seems to be not defined in the spec. + +See: https://www.openwall.com/lists/musl/2019/02/03/4 + +The free in support/export/hostname.c is removed too + +See: https://www.openwall.com/lists/musl/2019/02/17/2 + +Define and use wrapper function nfs_freeaddrinfo to handle +freeaddrinfo versions that don't tolerate NULL pointers + +Reviewed-by: Chuck Lever +Signed-off-by: Peter Wagner +Signed-off-by: Steve Dickson +--- + support/export/client.c | 6 +++--- + support/export/hostname.c | 4 ++-- + support/include/nfslib.h | 11 +++++++++++ + support/nfs/getport.c | 7 ++++--- + support/nfs/svc_create.c | 6 +++--- + support/nfsidmap/umich_ldap.c | 3 ++- + tests/nsm_client/nsm_client.c | 2 +- + utils/exportfs/exportfs.c | 10 +++++----- + utils/gssd/gssd.c | 4 ++-- + utils/gssd/krb5_util.c | 3 ++- + utils/mount/network.c | 6 +++--- + 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 | 3 +-- + utils/statd/hostname.c | 11 ++++++----- + utils/statd/sm-notify.c | 14 +++++++------- + 19 files changed, 63 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; +@@ -290,7 +290,7 @@ host_reliable_addrinfo(const struct sockaddr *sap) + if (nfs_compare_sockaddr(a->ai_addr, sap)) + break; + +- freeaddrinfo(ai); ++ nfs_freeaddrinfo(ai); + if (!a) + goto out_free_hostname; + +diff --git a/support/include/nfslib.h b/support/include/nfslib.h +index ab8b2bf..b09fce4 100644 +--- a/support/include/nfslib.h ++++ b/support/include/nfslib.h +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -156,4 +157,14 @@ void libtirpc_set_debug(char *name, int level, int use_stderr); + + #define UNUSED(x) UNUSED_ ## x __attribute__((unused)) + ++/* ++ * 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); ++ } ++} + #endif /* NFSLIB_H */ +diff --git a/support/nfs/getport.c b/support/nfs/getport.c +index 081594c..e458d8f 100644 +--- a/support/nfs/getport.c ++++ b/support/nfs/getport.c +@@ -47,6 +47,7 @@ + + #include "sockaddr.h" + #include "nfsrpc.h" ++#include "nfslib.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..4e14430 100644 +--- a/support/nfs/svc_create.c ++++ b/support/nfs/svc_create.c +@@ -273,7 +273,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 +364,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..10d1d97 100644 +--- a/support/nfsidmap/umich_ldap.c ++++ b/support/nfsidmap/umich_ldap.c +@@ -46,6 +46,7 @@ + /* We are using deprecated functions, get the prototypes... */ + #define LDAP_DEPRECATED 1 + #include ++#include "nfslib.h" + #include "nfsidmap.h" + #include "nfsidmap_plugin.h" + #include "nfsidmap_private.h" +@@ -1089,7 +1090,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..6daba44 100644 +--- a/utils/gssd/krb5_util.c ++++ b/utils/gssd/krb5_util.c +@@ -121,6 +121,7 @@ + #include + #include + ++#include "nfslib.h" + #include "gssd.h" + #include "err_util.h" + #include "gss_util.h" +@@ -587,7 +588,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..fc21110 100644 +--- a/utils/mount/network.c ++++ b/utils/mount/network.c +@@ -250,7 +250,7 @@ int nfs_lookup(const char *hostname, const sa_family_t family, + break; + } + +- freeaddrinfo(gai_results); ++ nfs_freeaddrinfo(gai_results); + return ret; + } + +@@ -307,7 +307,7 @@ int nfs_string_to_sockaddr(const char *address, struct sockaddr *sap, + } + break; + } +- freeaddrinfo(gai_results); ++ nfs_freeaddrinfo(gai_results); + } + + return ret; +@@ -1180,7 +1180,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..a093926 100644 +--- a/utils/mount/stropts.c ++++ b/utils/mount/stropts.c +@@ -35,6 +35,7 @@ + #include + #include + ++#include "nfslib.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..720bdd9 100644 +--- a/utils/nfsd/nfssvc.c ++++ b/utils/nfsd/nfssvc.c +@@ -246,8 +246,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..16e21fc 100644 +--- a/utils/statd/hostname.c ++++ b/utils/statd/hostname.c +@@ -35,6 +35,7 @@ + #include + #include + ++#include "nfslib.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..5e394a3 100644 +--- a/utils/statd/sm-notify.c ++++ b/utils/statd/sm-notify.c +@@ -36,6 +36,7 @@ + #include "sockaddr.h" + #include "xlog.h" + #include "nsm.h" ++#include "nfslib.h" + #include "nfsrpc.h" + + /* glibc before 2.3.4 */ +@@ -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; + } + +-- +1.8.3.1 + diff --git a/srcpkgs/nfs-utils/patches/musl-configure_ac.patch b/srcpkgs/nfs-utils/patches/musl-configure_ac.patch new file mode 100644 index 00000000000..96f613dc9d3 --- /dev/null +++ b/srcpkgs/nfs-utils/patches/musl-configure_ac.patch @@ -0,0 +1,31 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -547,11 +547,11 @@ + -pipe \ + -Wall \ + -Wextra \ +- -Werror=strict-prototypes \ +- -Werror=missing-prototypes \ +- -Werror=missing-declarations \ ++ -Wstrict-prototypes \ ++ -Wmissing-prototypes \ ++ -Wmissing-declarations \ + -Werror=format=2 \ +- -Werror=undef \ ++ -Wundef \ + -Werror=missing-include-dirs \ + -Werror=strict-aliasing=2 \ + -Werror=init-self \ +@@ -579,10 +579,10 @@ + + CHECK_CCSUPPORT([-Werror=format-overflow=2], [flg1]) + CHECK_CCSUPPORT([-Werror=int-conversion], [flg2]) +-CHECK_CCSUPPORT([-Werror=incompatible-pointer-types], [flg3]) ++#CHECK_CCSUPPORT([-Werror=incompatible-pointer-types], [flg3]) + CHECK_CCSUPPORT([-Werror=misleading-indentation], [flg4]) + +-AC_SUBST([AM_CFLAGS], ["$my_am_cflags $flg1 $flg2 $flg3 $flg4"]) ++AC_SUBST([AM_CFLAGS], ["$my_am_cflags $flg1 $flg2 $flg4"]) + + # Make sure that $ACLOCAL_FLAGS are used during a rebuild + AC_SUBST([ACLOCAL_AMFLAGS], ["-I $ac_macro_dir \$(ACLOCAL_FLAGS)"]) diff --git a/srcpkgs/nfs-utils/patches/musl-getservbyport.patch b/srcpkgs/nfs-utils/patches/musl-getservbyport.patch index cb74fb033cd..6a491d4a58e 100644 --- a/srcpkgs/nfs-utils/patches/musl-getservbyport.patch +++ b/srcpkgs/nfs-utils/patches/musl-getservbyport.patch @@ -1,9 +1,11 @@ Musl will always return something with getservbyport so we cannot skip ports that returns non-null. ---- utils/statd/rmtcall.c -+++ utils/statd/rmtcall.c -@@ -90,8 +90,10 @@ statd_get_socket(void) +diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c +index fd576d9..d72a0bf 100644 +--- a/utils/statd/rmtcall.c ++++ b/utils/statd/rmtcall.c +@@ -93,8 +93,10 @@ __func__); break; } @@ -12,5 +14,5 @@ ports that returns non-null. if (se == NULL) +#endif break; - /* rather not use that port, try again */ + if (retries == MAX_BRP_RETRIES) { diff --git a/srcpkgs/nfs-utils/patches/musl-in6.patch b/srcpkgs/nfs-utils/patches/musl-in6.patch index 36344e9d85b..342501b9162 100644 --- a/srcpkgs/nfs-utils/patches/musl-in6.patch +++ b/srcpkgs/nfs-utils/patches/musl-in6.patch @@ -1,12 +1,25 @@ ---- utils/mount/network.c 2016-08-03 20:25:15.000000000 +0200 -+++ utils/mount/network.c 2017-02-15 07:42:42.811596000 +0100 -@@ -38,7 +38,9 @@ +--- a/utils/mount/network.c ++++ b/utils/mount/network.c +@@ -39,11 +39,11 @@ #include #include #include -+#if defined(__GLIBC__) - #include -+#endif +-#if defined(__GLIBC__) && (__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 24) ++#if defined(__GLIBC__) && (__GLIBC__ < 2) || (defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 24) + /* Cannot safely include linux/in6.h in old glibc, so hardcode the needed values */ + # define IPV6_PREFER_SRC_PUBLIC 2 + # define IPV6_ADDR_PREFERENCES 72 +-#else ++#elif defined(__GLIBC__) + # include + #endif #include - #include - #include +@@ -1062,7 +1062,7 @@ int clnt_ping(struct sockaddr_in *saddr, const unsigned long prog, + if (caddr) { + /* Get the address of our end of this connection */ + socklen_t len = sizeof(*caddr); +- if (getsockname(sock, caddr, &len) != 0) ++ if (getsockname(sock, (struct sockaddr *)caddr, &len) != 0) + caddr->sin_family = 0; + } + diff --git a/srcpkgs/nfs-utils/patches/musl-svcgssd-sysconf.patch b/srcpkgs/nfs-utils/patches/musl-svcgssd-sysconf.patch new file mode 100644 index 00000000000..aab0e9612bf --- /dev/null +++ b/srcpkgs/nfs-utils/patches/musl-svcgssd-sysconf.patch @@ -0,0 +1,103 @@ +--- a/support/nfsidmap/libnfsidmap.c ++++ b/support/nfsidmap/libnfsidmap.c +@@ -430,11 +430,17 @@ + + nobody_user = conf_get_str("Mapping", "Nobody-User"); + if (nobody_user) { +- size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); ++ long scbuflen = sysconf(_SC_GETPW_R_SIZE_MAX); ++ size_t buflen = 1024; /*value on my gentoo glibc system that has _SC_GETPW_R_SIZE_MAX*/ + struct passwd *buf; + struct passwd *pw = NULL; + int err; + ++ /*sysconf can return -1 when _SC_GETPW_R_SIZE_MAX is not defined, like on musl systems, if cast to size_t this will lead ++ to an integer overflow, which leads to a buffer overflow and crashes svcgssd */ ++ if (scbuflen > 0) ++ buflen = (size_t)scbuflen; ++ + buf = malloc(sizeof(*buf) + buflen); + if (buf) { + err = getpwnam_r(nobody_user, buf, ((char *)buf) + sizeof(*buf), buflen, &pw); +@@ -451,10 +457,16 @@ + + nobody_group = conf_get_str("Mapping", "Nobody-Group"); + if (nobody_group) { +- size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX); ++ long scbuflen = sysconf(_SC_GETGR_R_SIZE_MAX); ++ size_t buflen = 1024; /*value on my gentoo glibc system that has _SC_GETGR_R_SIZE_MAX*/ + struct group *buf; + struct group *gr = NULL; + int err; ++ ++ /*sysconf can return -1 when _SC_GETGR_R_SIZE_MAX is not defined, like on musl systems, if cast to size_t this will lead ++ to an integer overflow, which leads to a buffer overflow and crashes svcgssd */ ++ if (scbuflen > 0) ++ buflen = (size_t)scbuflen; + + buf = malloc(sizeof(*buf) + buflen); + if (buf) { +--- a/support/nfsidmap/static.c ++++ b/support/nfsidmap/static.c +@@ -98,10 +98,14 @@ + { + struct passwd *pw; + struct pwbuf *buf; +- size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); ++ long scbuflen = sysconf(_SC_GETPW_R_SIZE_MAX); ++ size_t buflen = 1024; + char *localname; + int err; + ++ if (scbuflen > 0) ++ buflen = (size_t)scbuflen; ++ + buf = malloc(sizeof(*buf) + buflen); + if (!buf) { + err = ENOMEM; +@@ -149,9 +153,13 @@ + { + struct group *gr; + struct grbuf *buf; +- size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX); ++ long scbuflen = sysconf(_SC_GETGR_R_SIZE_MAX); ++ size_t buflen = 1024; + char *localgroup; + int err; ++ ++ if (scbuflen > 0) ++ buflen = (size_t)scbuflen; + + buf = malloc(sizeof(*buf) + buflen); + if (!buf) { +--- a/support/nfsidmap/nss.c ++++ b/support/nfsidmap/nss.c +@@ -91,9 +91,13 @@ + struct passwd *pw = NULL; + struct passwd pwbuf; + char *buf; +- size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); ++ long scbuflen = sysconf(_SC_GETPW_R_SIZE_MAX); ++ size_t buflen = 1024; + int err = -ENOMEM; + ++ if (scbuflen > 0) ++ buflen = (size_t)scbuflen; ++ + buf = malloc(buflen); + if (!buf) + goto out; +@@ -119,8 +123,12 @@ + struct group *gr = NULL; + struct group grbuf; + char *buf; +- size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX); ++ long scbuflen = sysconf(_SC_GETGR_R_SIZE_MAX); ++ size_t buflen = 1024; + int err; ++ ++ if (scbuflen > 0) ++ buflen = (size_t)scbuflen; + + if (domain == NULL) + domain = get_default_domain(); diff --git a/srcpkgs/nfs-utils/patches/nfs-utils-1.1.4-mtab-sym.patch b/srcpkgs/nfs-utils/patches/nfs-utils-1.1.4-mtab-sym.patch index bf0eb54ce7f..ab66d8c1e3f 100644 --- a/srcpkgs/nfs-utils/patches/nfs-utils-1.1.4-mtab-sym.patch +++ b/srcpkgs/nfs-utils/patches/nfs-utils-1.1.4-mtab-sym.patch @@ -1,7 +1,5 @@ -ripped from Debian - ---- utils/mount/fstab.c -+++ utils/mount/fstab.c +--- ./utils/mount/fstab.c ++++ ./utils/mount/fstab.c @@ -57,7 +57,7 @@ mtab_does_not_exist(void) { return var_mtab_does_not_exist; } @@ -11,8 +9,8 @@ ripped from Debian mtab_is_a_symlink(void) { get_mtab_info(); return var_mtab_is_a_symlink; ---- utils/mount/fstab.h -+++ utils/mount/fstab.h +--- ./utils/mount/fstab.h ++++ ./utils/mount/fstab.h @@ -7,6 +7,7 @@ #define _PATH_FSTAB "/etc/fstab" #endif @@ -21,9 +19,9 @@ ripped from Debian int mtab_is_writable(void); int mtab_does_not_exist(void); void reset_mtab_info(void); ---- utils/mount/mount.c -+++ utils/mount/mount.c -@@ -230,6 +230,13 @@ create_mtab (void) { +--- ./utils/mount/mount.c ++++ ./utils/mount/mount.c +@@ -204,6 +204,13 @@ int flags; mntFILE *mfp; diff --git a/srcpkgs/nfs-utils/template b/srcpkgs/nfs-utils/template index 07ad16c29a3..6b7dcbdf88a 100644 --- a/srcpkgs/nfs-utils/template +++ b/srcpkgs/nfs-utils/template @@ -1,7 +1,7 @@ # Template file for 'nfs-utils' pkgname=nfs-utils -version=1.3.4 -revision=6 +version=2.3.3 +revision=1 build_style=gnu-configure configure_args="--with-statduser=nobody --enable-gss --enable-nfsv4 --with-statedir=/var/lib/nfs --enable-libmount-mount --enable-svcgss @@ -10,15 +10,17 @@ configure_args="--with-statduser=nobody --enable-gss --enable-nfsv4 --with-krb5=$XBPS_CROSS_BASE" short_desc="Network File System utilities" maintainer="Juan RP " -license="GPL-2" +license="GPL-2.0-or-later" homepage="http://nfs.sourceforge.net" distfiles="${KERNEL_SITE}/utils/${pkgname}/${version}/${pkgname}-${version}.tar.xz" -checksum=b42a5bc0a8d80d04650030ceb9a11f08f4acfbcb1ee297f657fb94e339c45975 +checksum=f68b34793831b05f1fd5760d6bdec92772c7684177586a99a61e7b444f336322 +patch_args="-Np1" +replaces="rpcgen>=0" hostmakedepends="pkg-config libtirpc-devel" makedepends="libblkid-devel libmount-devel libtirpc-devel libnfsidmap-devel keyutils-devel libevent-devel mit-krb5-devel - device-mapper-devel libcap-devel sqlite-devel" + device-mapper-devel libcap-devel sqlite-devel rpcsvc-proto" depends="rpcbind" conf_files="/etc/exports /etc/idmapd.conf" make_dirs=" @@ -28,17 +30,13 @@ make_dirs=" /etc/exports.d 0750 root root " -pre_build() { - if [ "$CROSS_BUILD" ]; then - sed -i '/SUBDIRS/s,tools,,' Makefile.in - fi +pre_configure() { case "$XBPS_TARGET_MACHINE" in *-musl) - cd tools/rpcgen - make CC=cc CFLAGS= CPPFLAGS= LDFLAGS= ${makejobs} - ;; + sed -Ei -e 's/__res_querydomain/res_querydomain/g' configure* esac } + post_install() { mv ${DESTDIR}/sbin/* ${DESTDIR}/usr/bin # conffiles @@ -57,18 +55,3 @@ post_install() { rm -rf ${DESTDIR}/var/lib/nfs } - -rpcgen_package() { - build_style=meta - short_desc="A RPC protocol compiler" - pkg_install() { - case "$XBPS_TARGET_MACHINE" in - *-musl) - cd ${wrksrc}/tools/rpcgen - make clean - make CC_FOR_BUILD="$CC" - vbin ${wrksrc}/tools/rpcgen/rpcgen - ;; - esac - } -} diff --git a/srcpkgs/rpcgen b/srcpkgs/rpcgen deleted file mode 120000 index 82a7ac49404..00000000000 --- a/srcpkgs/rpcgen +++ /dev/null @@ -1 +0,0 @@ -nfs-utils \ No newline at end of file