Hello community, here is the log from the commit of package rpcbind for openSUSE:Factory checked in at 2012-05-03 11:00:23 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rpcbind (Old) and /work/SRC/openSUSE:Factory/.rpcbind.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rpcbind", Maintainer is "[email protected]" Changes: -------- --- /work/SRC/openSUSE:Factory/rpcbind/rpcbind.changes 2012-02-14 19:07:18.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.rpcbind.new/rpcbind.changes 2012-05-03 11:00:24.000000000 +0200 @@ -1,0 +2,11 @@ +Wed Apr 18 23:46:52 CEST 2012 - [email protected] + +- socket-activation: Fix rpcbind.service to use separate + sockets (bnc#757909). + +------------------------------------------------------------------- +Wed Apr 18 05:47:20 CEST 2012 - [email protected] + +- socket-activation: don't unlink socket we didn't create (bnc#757667). + +------------------------------------------------------------------- New: ---- socket-activation-don-t-unlink-socket-we-didn-t-create socket-activation-fix-rpcbind-service-to-use-separate-sockets ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rpcbind.spec ++++++ --- /var/tmp/diff_new_pack.CCcPmd/_old 2012-05-03 11:00:25.000000000 +0200 +++ /var/tmp/diff_new_pack.CCcPmd/_new 2012-05-03 11:00:25.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package rpcbind # -# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,13 +16,12 @@ # - Name: rpcbind -License: BSD-3-Clause -Group: Productivity/Networking/System Version: 0.2.0_git201103171419 -Release: 1 +Release: 0 Summary: Transport independent RPC portmapper +License: BSD-3-Clause +Group: Productivity/Networking/System Url: http://git.infradead.org/users/steved/rpcbind.git Source: %{name}-%{version}.tar.bz2 Source1: rpcbind.init @@ -31,15 +30,18 @@ Source4: pmap_set.c BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: libtirpc-devel -BuildRequires: tcpd-devel BuildRequires: libtool BuildRequires: pkgconfig +BuildRequires: tcpd-devel Provides: portmap = 6.0+git20070716 Obsoletes: portmap <= 6.0+git20070716 # hopefully soon we will have this autogenerated from rpm -Provides: sysvinit(portmap) sysvinit(rpcbind) +Provides: sysvinit(portmap) +Provides: sysvinit(rpcbind) PreReq: %insserv_prereq %fillup_prereq /sbin/checkproc sysvinit(network) syslog Patch0: 0001-systemd-add-support-for-system-bus-activation.patch +Patch1: socket-activation-don-t-unlink-socket-we-didn-t-create +Patch2: socket-activation-fix-rpcbind-service-to-use-separate-sockets %define statefile /var/lib/portmap.state %if 0%{?suse_version} > 1140 BuildRequires: systemd-devel @@ -65,6 +67,8 @@ %setup -q cp %{SOURCE4} . %patch0 -p1 +%patch1 -p1 +%patch2 -p1 %build autoreconf -fiv ++++++ socket-activation-don-t-unlink-socket-we-didn-t-create ++++++ From: Jeff Mahoney <[email protected]> Subject: socket-activation: don't unlink socket we didn't create References: bnc#757667 On an unpatched system, try this: rpcinfo <works> rcrpcbind restart rpcinfo <fails> This is due to rpcbind unlinking the socket file when it exits. It doesn't own the socket file when socket activation is used - systemd does. Systemd still has an open reference to it and when rpcbind is restarted, it passes the open reference back to it and rpcbind is perfectly happy to accept it. Unfortunately, everything that needs to talk to rpcbind no longer can because the socket file each of those users needs to open is no longer on the file system. This patch adds a new global that's used to avoid unlinking the rpcbind.sock socket file during shutdown. Signed-off-by: Jeff Mahoney <[email protected]> --- src/rpcbind.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) --- a/src/rpcbind.c +++ b/src/rpcbind.c @@ -80,6 +81,7 @@ int debugging = 0; /* Tell me what's going on */ int doabort = 0; /* When debugging, do an abort on errors */ int dofork = 1; /* fork? */ +int sock_needs_unlink = 1; /* we created rpcbind.sock */ rpcblist_ptr list_rbl; /* A list of version 3/4 rpcbind services */ @@ -365,6 +396,14 @@ init_transport(struct netconfig *nconf) nconf->nc_netid); goto error; } + + /* + * We were passed the open UNIX socket + * and shouldn't remove it. + */ + if (sa.sa.sa_family == AF_UNIX && + strcmp(sa.un.sun_path, _PATH_RPCBINDSOCK)) + sock_needs_unlink = 0; } /* if none of the systemd sockets matched, we set up the socket in @@ -784,7 +823,8 @@ static void terminate(int dummy /*__unused*/) { close(rpcbindlockfd); - unlink(_PATH_RPCBINDSOCK); + if (sock_needs_unlink) + unlink(_PATH_RPCBINDSOCK); unlink(RPCBINDDLOCK); #ifdef WARMSTART syslog(LOG_ERR, ++++++ socket-activation-fix-rpcbind-service-to-use-separate-sockets ++++++ From: Jeff Mahoney <[email protected]> Subject: socket-activation: Fix rpcbind.service to use separate sockets References: bnc#757909 systemd will, by default, pass a socket that provides both IPv4 and IPv6 services. RPC netconfig requires that sockets be either IPv4 or IPv6. This patch fixes the rpcbind.socket unit file and adds a warning to rpcbind should the user encounter an issue. Signed-off-by: Jeff Mahoney <[email protected]> --- src/rpcbind.c | 32 +++++++++++++++++++++++++++++++- systemd/rpcbind.socket | 9 +++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) --- a/src/rpcbind.c +++ b/src/rpcbind.c @@ -50,6 +50,7 @@ #include <sys/file.h> #include <sys/socket.h> #include <sys/un.h> +#include <netinet/in.h> #include <rpc/rpc.h> #include <rpc/rpc_com.h> #ifdef PORTMAP @@ -262,6 +264,32 @@ main(int argc, char *argv[]) } /* + * Normally systemd will open sockets in dual ipv4/ipv6 mode. + * That won't work with netconfig and we'll only match + * the ipv6 socket. Convert it to IPV6_V6ONLY and issue + * a warning for the user to fix their systemd config. + */ +static int +handle_ipv6_socket(int fd) +{ + int opt; + socklen_t len = sizeof(opt); + + if (getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &opt, &len)) { + syslog(LOG_ERR, "failed to get ipv6 socket opts: %s", + strerror(errno)); + return 1; + } + + if (opt) /* socket is already in V6ONLY mode */ + return 0; + + syslog(LOG_ERR, "systemd has passed an IPv4/IPv6 dual-mode socket."); + syslog(LOG_ERR, "Please fix your systemd config by specifying IPv4 and IPv6 sockets separately and using BindIPv6Only=ipv6-only."); + return 1; +} + +/* * Adds the entry into the rpcbind database. * If PORTMAP, then for UDP and TCP, it adds the entries for version 2 also * Returns 0 if succeeds, else fails @@ -313,7 +341,7 @@ init_transport(struct netconfig *nconf) #ifdef SYSTEMD n = sd_listen_fds(0); if (n < 0) { - syslog(LOG_ERR, "failed to acquire systemd scokets: %s", strerror(-n)); + syslog(LOG_ERR, "failed to acquire systemd sockets: %s", strerror(-n)); return 1; } @@ -347,6 +375,9 @@ init_transport(struct netconfig *nconf) goto error; } + if (sa.sa.sa_family == AF_INET6 && handle_ipv6_socket(fd)) + goto error; + /* Copy the address */ taddr.addr.maxlen = taddr.addr.len = addrlen; taddr.addr.buf = malloc(addrlen); --- a/systemd/rpcbind.socket +++ b/systemd/rpcbind.socket @@ -5,8 +5,13 @@ Before=rpcbind.target [Socket] ListenStream=/var/run/rpcbind.sock -ListenStream=111 -ListenDatagram=111 + +# RPC netconfig can't handle ipv6/ipv4 dual sockets +BindIPv6Only=ipv6-only +ListenStream=0.0.0.0:111 +ListenDatagram=0.0.0.0:111 +ListenStream=[::]:111 +ListenDatagram=[::]:111 [Install] WantedBy=sockets.target -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
