nfs-utils: update to 2.3.3

This commit is contained in:
svenper 2019-04-16 01:40:44 +02:00 committed by Enno Boland
parent f8116f7159
commit efa196a2dd
14 changed files with 986 additions and 123 deletions

View file

@ -1,39 +0,0 @@
From 0b4df13026eb371b68abc4b8cec4ca8d90c3b0a3 Mon Sep 17 00:00:00 2001
From: Natanael Copa <ncopa@alpinelinux.org>
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 <ncopa@alpinelinux.org>
---
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

View file

@ -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 <time.h>
#include <stdbool.h>
+#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

View file

@ -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 <ps@pks.im>
Signed-off-by: Steve Dickson <steved@redhat.com>
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;

View file

@ -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 <libgen.h>
#include <errno.h>
#include <libdevmapper.h>
+#include <sys/sysmacros.h>
#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 <fcntl.h>
#include <errno.h>
#include <libdevmapper.h>
+#include <sys/sysmacros.h>
#include "device-discovery.h"

View file

@ -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 <reiver@improbability.net>
X-Patchwork-Id: 9802949
Message-Id: <20170621212338.32460-1-reiver@improbability.net>
To: linux-nfs@vger.kernel.org
Cc: Alan Swanson <reiver@improbability.net>
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 <sys/types.h>
#include <sys/time.h>
-#include <sys/poll.h>
+#include <sys/inotify.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <time.h>
@@ -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();

View file

@ -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 <stdlib.h>
#include <dirent.h>
#include <errno.h>
+#include <limits.h>
#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 <sys/stat.h>
#include <errno.h>
#include <libgen.h>
+#include <limits.h>
#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 <dirent.h>
#include <stdlib.h>
#include <stdbool.h>
+#include <limits.h>
#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 <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <limits.h>
#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 <fcntl.h>
#include <dirent.h>
#include <grp.h>
+#include <limits.h>
#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 <unistd.h>
#include <libgen.h>
#include <errno.h>
+#include <limits.h>
#include <libdevmapper.h>
#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 <krb5.h>
#include <rpc/auth_gss.h>
+#include <limits.h>
#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 <pwd.h>
#include <grp.h>
#include <mntent.h>
+#include <limits.h>
#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 <fcntl.h>
#include <sys/resource.h>
#include <sys/wait.h>
+#include <limits.h>
#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 <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
+#include <limits.h>
#include "misc.h"
#include "exportfs.h"

View file

@ -0,0 +1,576 @@
From ed06fade6dc46df0a38caab2e465dfaabfc76f46 Mon Sep 17 00:00:00 2001
From: Peter Wagner <tripolar@gmx.at>
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 <chuck.lever@oracle.com>
Signed-off-by: Peter Wagner <tripolar@gmx.at>
Signed-off-by: Steve Dickson <steved@redhat.com>
---
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 <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <netdb.h>
#include <stdio.h>
#include <stdbool.h>
#include <paths.h>
@@ -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 <ldap.h>
+#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 <krb5.h>
#include <rpc/auth_gss.h>
+#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 <netinet/in.h>
#include <arpa/inet.h>
+#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 <netdb.h>
#include <arpa/inet.h>
+#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

View file

@ -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)"])

View file

@ -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) {

View file

@ -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 <sys/socket.h>
#include <sys/wait.h>
#include <sys/stat.h>
+#if defined(__GLIBC__)
#include <linux/in6.h>
+#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 <linux/in6.h>
#endif
#include <netinet/in.h>
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
@@ -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;
}

View file

@ -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();

View file

@ -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;

View file

@ -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 <xtraeme@voidlinux.org>"
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
}
}

View file

@ -1 +0,0 @@
nfs-utils