|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
From: Michal Privoznik <mprivozn@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
Date: Thu, 2 Apr 2015 14:41:17 +0200
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
Subject: [PATCH] virNetSocketNewConnectUNIX: Use flocks when spawning a daemon
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
https://bugzilla.redhat.com/show_bug.cgi?id=1200149
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
Even though we have a mutex mechanism so that two clients don't spawn
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
two daemons, it's not strong enough. It can happen that while one
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
client is spawning the daemon, the other one fails to connect.
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
Basically two possible errors can happen:
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
error: Failed to connect socket to '/home/mprivozn/.cache/libvirt/libvirt-sock': Connection refused
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
or:
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
error: Failed to connect socket to '/home/mprivozn/.cache/libvirt/libvirt-sock': No such file or directory
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
The problem in both cases is, the daemon is only starting up, while we
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
are trying to connect (and fail). We should postpone the connecting
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
phase until the daemon is started (by the other thread that is
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
spawning it). In order to do that, create a file lock 'libvirt-lock'
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
in the directory where session daemon would create its socket. So even
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
when called from multiple processes, spawning a daemon will serialize
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
on the file lock. So only the first to come will spawn the daemon.
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
Tested-by: Richard W. M. Jones <rjones@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
(cherry picked from commit be78814ae07f092d9c4e71fd82dd1947aba2f029)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
---
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
src/rpc/virnetsocket.c | 164 +++++++++++++++++--------------------------------
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
1 file changed, 55 insertions(+), 109 deletions(-)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
index 6b019cc..b824285 100644
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
--- a/src/rpc/virnetsocket.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+++ b/src/rpc/virnetsocket.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
@@ -123,7 +123,7 @@ VIR_ONCE_GLOBAL_INIT(virNetSocket)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
#ifndef WIN32
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-static int virNetSocketForkDaemon(const char *binary, int passfd)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+static int virNetSocketForkDaemon(const char *binary)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
{
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
int ret;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virCommandPtr cmd = virCommandNewArgList(binary,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
@@ -136,10 +136,6 @@ static int virNetSocketForkDaemon(const char *binary, int passfd)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virCommandAddEnvPassBlockSUID(cmd, "XDG_RUNTIME_DIR", NULL);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virCommandClearCaps(cmd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virCommandDaemonize(cmd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (passfd) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virCommandPassFD(cmd, passfd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virCommandPassListenFDs(cmd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
ret = virCommandRun(cmd, NULL);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virCommandFree(cmd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
return ret;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
@@ -543,45 +539,26 @@ int virNetSocketNewConnectUNIX(const char *path,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
const char *binary,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virNetSocketPtr *retsock)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
{
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- char *binname = NULL;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- char *pidpath = NULL;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- int fd, passfd = -1;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- int pidfd = -1;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ char *lockpath = NULL;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ int lockfd = -1;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ int fd = -1;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ int retries = 100;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virSocketAddr localAddr;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virSocketAddr remoteAddr;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ char *rundir = NULL;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
memset(&localAddr, 0, sizeof(localAddr));
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
memset(&remoteAddr, 0, sizeof(remoteAddr));
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
remoteAddr.len = sizeof(remoteAddr.data.un);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (spawnDaemon && !binary) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- _("Auto-spawn of daemon requested, but no binary specified"));
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- return -1;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virReportSystemError(errno, "%s", _("Failed to create socket"));
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- remoteAddr.data.un.sun_family = AF_UNIX;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (virStrcpyStatic(remoteAddr.data.un.sun_path, path) == NULL) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virReportSystemError(ENOMEM, _("Path %s too long for unix socket"), path);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (remoteAddr.data.un.sun_path[0] == '@')
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- remoteAddr.data.un.sun_path[0] = '\0';
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- retry:
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (connect(fd, &remoteAddr.data.sa, remoteAddr.len) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- int status = 0;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- pid_t pid = 0;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (spawnDaemon) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ const char *binname;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (!spawnDaemon) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virReportSystemError(errno, _("Failed to connect socket to '%s'"),
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- path);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (spawnDaemon && !binary) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ _("Auto-spawn of daemon requested, "
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ "but no binary specified"));
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
@@ -592,90 +569,63 @@ int virNetSocketNewConnectUNIX(const char *path,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (virPidFileConstructPath(false, NULL, binname, &pidpath) < 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (!(rundir = virGetUserRuntimeDirectory()))
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- pidfd = virPidFileAcquirePath(pidpath, false, getpid());
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (pidfd < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- /*
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * This can happen in a very rare case of two clients spawning two
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * daemons at the same time, and the error in the logs that gets
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * reset here can be a clue to some future debugging.
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virResetLastError();
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- spawnDaemon = false;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- goto retry;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if ((passfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virReportSystemError(errno, "%s", _("Failed to create socket"));
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (virFileMakePathWithMode(rundir, 0700) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ virReportSystemError(errno,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ _("Cannot create user runtime directory '%s'"),
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ rundir);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- /*
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * We already even acquired the pidfile, so no one else should be using
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * @path right now. So we're OK to unlink it and paying attention to
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * the return value makes no real sense here. Only if it's not an
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * abstract socket, of course.
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (path[0] != '@')
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- unlink(path);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- /*
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * We have to fork() here, because umask() is set per-process, chmod()
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * is racy and fchmod() has undefined behaviour on sockets according to
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * POSIX, so it doesn't work outside Linux.
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if ((pid = virFork()) < 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (virAsprintf(&lockpath, "%s/%s.lock", rundir, binname) < 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (pid == 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- umask(0077);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (bind(passfd, &remoteAddr.data.sa, remoteAddr.len) < 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- _exit(EXIT_FAILURE);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- _exit(EXIT_SUCCESS);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (virProcessWait(pid, &status, false) < 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if ((lockfd = open(lockpath, O_RDWR | O_CREAT, 0600)) < 0 ||
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ virSetCloseExec(lockfd) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ virReportSystemError(errno, _("Unable to create lock '%s'"), lockpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (status != EXIT_SUCCESS) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- /*
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * OK, so the child failed to bind() the socket. This may mean that
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * another daemon was starting at the same time and succeeded with
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * its bind() (even though it should not happen because we using a
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * pidfile for the race). So we'll try connecting again, but this
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * time without spawning the daemon.
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- spawnDaemon = false;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virPidFileDeletePath(pidpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- VIR_FORCE_CLOSE(pidfd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- VIR_FORCE_CLOSE(passfd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- goto retry;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (listen(passfd, 0) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virReportSystemError(errno, "%s",
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- _("Failed to listen on socket that's about "
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- "to be passed to the daemon"));
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (virFileLock(lockfd, false, 0, 1, true) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ virReportSystemError(errno, _("Unable to lock '%s'"), lockpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ virReportSystemError(errno, "%s", _("Failed to create socket"));
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (connect(fd, &remoteAddr.data.sa, remoteAddr.len) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ remoteAddr.data.un.sun_family = AF_UNIX;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (virStrcpyStatic(remoteAddr.data.un.sun_path, path) == NULL) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ virReportSystemError(ENOMEM, _("Path %s too long for unix socket"), path);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (remoteAddr.data.un.sun_path[0] == '@')
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ remoteAddr.data.un.sun_path[0] = '\0';
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ while (retries &&
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ connect(fd, &remoteAddr.data.sa, remoteAddr.len) < 0) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (!(spawnDaemon && errno == ENOENT)) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
virReportSystemError(errno, _("Failed to connect socket to '%s'"),
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
path);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- /*
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * Do we need to eliminate the super-rare race here any more? It would
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * need incorporating the following VIR_FORCE_CLOSE() into a
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- * virCommandHook inside a virNetSocketForkDaemon().
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- VIR_FORCE_CLOSE(pidfd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (virNetSocketForkDaemon(binary, passfd) < 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (virNetSocketForkDaemon(binary) < 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ retries--;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ usleep(5000);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (lockfd) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ unlink(lockpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ VIR_FORCE_CLOSE(lockfd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ VIR_FREE(lockpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
localAddr.len = sizeof(localAddr.data);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
@@ -687,19 +637,15 @@ int virNetSocketNewConnectUNIX(const char *path,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
if (!(*retsock = virNetSocketNew(&localAddr, &remoteAddr, true, fd, -1, 0)))
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
goto error;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- VIR_FREE(pidpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
return 0;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
error:
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (pidfd >= 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- virPidFileDeletePath(pidpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- VIR_FREE(pidpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ if (lockfd)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ unlink(lockpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ VIR_FREE(lockpath);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ VIR_FREE(rundir);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
VIR_FORCE_CLOSE(fd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- VIR_FORCE_CLOSE(passfd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- VIR_FORCE_CLOSE(pidfd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- if (spawnDaemon)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
- unlink(path);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
+ VIR_FORCE_CLOSE(lockfd);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
return -1;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
c5b0b3 |
#else
|