[libvirt] [PATCH 2/2] Create hostdevmgr in UserRuntimeDirectory for session libvirt

Ján Tomko jtomko at redhat.com
Fri Mar 28 09:20:31 UTC 2014


Without this, session libvirt won't start if it fails to create
the directory.
---

So far the directory is only used by SRIOV, which I believe does not work
for unprivileged libvirt, but I found always creating the state dir nicer
than possibly crashing on NULL derefernce.

 src/util/virhostdev.c | 40 +++++++++++++++++++++++++++++++++-------
 1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
index d80dbf7..7936289 100644
--- a/src/util/virhostdev.c
+++ b/src/util/virhostdev.c
@@ -89,6 +89,7 @@ static virHostdevManagerPtr
 virHostdevManagerNew(void)
 {
     virHostdevManagerPtr hostdevMgr;
+    bool privileged = geteuid() == 0;
 
     if (!(hostdevMgr = virObjectNew(virHostdevManagerClass)))
         return NULL;
@@ -105,14 +106,39 @@ virHostdevManagerNew(void)
     if ((hostdevMgr->activeSCSIHostdevs = virSCSIDeviceListNew()) == NULL)
         goto error;
 
-    if (VIR_STRDUP(hostdevMgr->stateDir, HOSTDEV_STATE_DIR) < 0)
-        goto error;
+    if (privileged) {
+        if (VIR_STRDUP(hostdevMgr->stateDir, HOSTDEV_STATE_DIR) < 0)
+            goto error;
 
-    if (virFileMakePath(hostdevMgr->stateDir) < 0) {
-        virReportError(VIR_ERR_OPERATION_FAILED,
-                       _("Failed to create state dir '%s'"),
-                       hostdevMgr->stateDir);
-        goto error;
+        if (virFileMakePath(hostdevMgr->stateDir) < 0) {
+            virReportError(VIR_ERR_OPERATION_FAILED,
+                           _("Failed to create state dir '%s'"),
+                           hostdevMgr->stateDir);
+            goto error;
+        }
+    } else {
+        char *rundir = NULL;
+        mode_t old_umask;
+
+        if (!(rundir = virGetUserRuntimeDirectory()))
+            goto error;
+
+        if (virAsprintf(&hostdevMgr->stateDir, "%s/hostdevmgr", rundir) < 0) {
+            VIR_FREE(rundir);
+            goto error;
+        }
+        VIR_FREE(rundir);
+
+        old_umask = umask(077);
+
+        if (virFileMakePath(hostdevMgr->stateDir) < 0) {
+            umask(old_umask);
+            virReportError(VIR_ERR_OPERATION_FAILED,
+                           _("Failed to create state dir '%s'"),
+                           hostdevMgr->stateDir);
+            goto error;
+        }
+        umask(old_umask);
     }
 
     return hostdevMgr;
-- 
1.8.3.2




More information about the libvir-list mailing list