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 "OKir@suse.com"
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 - jeffm@suse.de
+
+- socket-activation: Fix rpcbind.service to use separate
+ sockets (bnc#757909).
+
+-------------------------------------------------------------------
+Wed Apr 18 05:47:20 CEST 2012 - jeffm@suse.de
+
+- 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
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
---
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
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
---
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
#include
#include
+#include
#include
#include
#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: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org