c401cc
From 8a557289017d7549bebf00164214bf377761dabc Mon Sep 17 00:00:00 2001
c401cc
Message-Id: <8a557289017d7549bebf00164214bf377761dabc@dist-git>
c401cc
From: "Daniel P. Berrange" <berrange@redhat.com>
c401cc
Date: Tue, 18 Feb 2014 15:45:37 -0700
c401cc
Subject: [PATCH] Add virFileMakeParentPath helper function
c401cc
c401cc
https://bugzilla.redhat.com/show_bug.cgi?id=1045643
c401cc
prereq of CVE-2013-6456
c401cc
c401cc
Add a helper function which takes a file path and ensures
c401cc
that all directory components leading up to the file exist.
c401cc
IOW, it strips the filename part of the path and passes
c401cc
the result to virFileMakePath.
c401cc
c401cc
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
c401cc
(cherry picked from commit c321bfc5c37c603af349dacf531bb03c91b0755e)
c401cc
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
c401cc
---
c401cc
 src/libvirt_private.syms |  1 +
c401cc
 src/util/virfile.c       | 29 +++++++++++++++++++++++++++++
c401cc
 src/util/virfile.h       |  1 +
c401cc
 3 files changed, 31 insertions(+)
c401cc
c401cc
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
c401cc
index 852affa..e5f80e1 100644
c401cc
--- a/src/libvirt_private.syms
c401cc
+++ b/src/libvirt_private.syms
c401cc
@@ -1393,6 +1393,7 @@ virFileIsMountPoint;
c401cc
 virFileLinkPointsTo;
c401cc
 virFileLock;
c401cc
 virFileLoopDeviceAssociate;
c401cc
+virFileMakeParentPath;
c401cc
 virFileMakePath;
c401cc
 virFileMakePathWithMode;
c401cc
 virFileMatchesNameSuffix;
c401cc
diff --git a/src/util/virfile.c b/src/util/virfile.c
c401cc
index 0d4a6be..defcc3f 100644
c401cc
--- a/src/util/virfile.c
c401cc
+++ b/src/util/virfile.c
c401cc
@@ -2262,6 +2262,35 @@ cleanup:
c401cc
     return ret;
c401cc
 }
c401cc
 
c401cc
+
c401cc
+int
c401cc
+virFileMakeParentPath(const char *path)
c401cc
+{
c401cc
+    char *p;
c401cc
+    char *tmp;
c401cc
+    int ret = -1;
c401cc
+
c401cc
+    VIR_DEBUG("path=%s", path);
c401cc
+
c401cc
+    if (VIR_STRDUP(tmp, path) < 0) {
c401cc
+        errno = ENOMEM;
c401cc
+        return -1;
c401cc
+    }
c401cc
+
c401cc
+    if ((p = strrchr(tmp, '/')) == NULL) {
c401cc
+        errno = EINVAL;
c401cc
+        goto cleanup;
c401cc
+    }
c401cc
+    *p = '\0';
c401cc
+
c401cc
+    ret = virFileMakePathHelper(tmp, 0777);
c401cc
+
c401cc
+ cleanup:
c401cc
+    VIR_FREE(tmp);
c401cc
+    return ret;
c401cc
+}
c401cc
+
c401cc
+
c401cc
 /* Build up a fully qualified path for a config file to be
c401cc
  * associated with a persistent guest or network */
c401cc
 char *
c401cc
diff --git a/src/util/virfile.h b/src/util/virfile.h
c401cc
index 0d20cdb..20baf6f 100644
c401cc
--- a/src/util/virfile.h
c401cc
+++ b/src/util/virfile.h
c401cc
@@ -198,6 +198,7 @@ int virDirCreate(const char *path, mode_t mode, uid_t uid, gid_t gid,
c401cc
 int virFileMakePath(const char *path) ATTRIBUTE_RETURN_CHECK;
c401cc
 int virFileMakePathWithMode(const char *path,
c401cc
                             mode_t mode) ATTRIBUTE_RETURN_CHECK;
c401cc
+int virFileMakeParentPath(const char *path) ATTRIBUTE_RETURN_CHECK;
c401cc
 
c401cc
 char *virFileBuildPath(const char *dir,
c401cc
                        const char *name,
c401cc
-- 
c401cc
1.9.0
c401cc