rpcbind/socket-activation-don-t-unlink-socket-we-didn-t-create
Marcus Meissner 5626fd603f Accepting request 114480 from home:jeff_mahoney:branches:network
- socket-activation: Fix rpcbind.service to use separate
  sockets (bnc#757909).

- socket-activation: don't unlink socket we didn't create (bnc#757667).

OBS-URL: https://build.opensuse.org/request/show/114480
OBS-URL: https://build.opensuse.org/package/show/network/rpcbind?expand=0&rev=17
2012-04-23 21:00:10 +00:00

62 lines
1.9 KiB
Plaintext

From: Jeff Mahoney <jeffm@suse.com>
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 <jeffm@suse.com>
---
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,