Blame SOURCES/0128-dump_dir-allow-hooks-to-create-dump-directory-withou.patch

28bab8
From e76a8655152129de09bd9521ade8158bb07cc8fe Mon Sep 17 00:00:00 2001
28bab8
From: Jakub Filak <jfilak@redhat.com>
28bab8
Date: Wed, 15 Apr 2015 17:41:49 +0200
28bab8
Subject: [LIBREPORT PATCH] dump_dir: allow hooks to create dump directory
28bab8
 without parents
28bab8
28bab8
With a centralized model of handling problems like ABRT, there is a need
28bab8
to ensure that every dump directory is a descendant of some central
28bab8
directory (database). This commit together with other security commits
28bab8
makes code of the tools creating the dump directories in the central
28bab8
directory more robust by ensuring that no tool accidentally creates the
28bab8
central directory and all tools creates exactly one directory.
28bab8
28bab8
Related: #1211835
28bab8
28bab8
Signed-off-by: Jakub Filak <jfilak@redhat.com>
28bab8
---
28bab8
 src/include/dump_dir.h |  4 +++-
28bab8
 src/lib/dump_dir.c     | 12 +++++++++---
28bab8
 2 files changed, 12 insertions(+), 4 deletions(-)
28bab8
28bab8
diff --git a/src/include/dump_dir.h b/src/include/dump_dir.h
28bab8
index 71cf66f..8f672d3 100644
28bab8
--- a/src/include/dump_dir.h
28bab8
+++ b/src/include/dump_dir.h
28bab8
@@ -43,6 +43,8 @@ enum {
28bab8
     DD_OPEN_READONLY = (1 << 3),
28bab8
     DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE = (1 << 4),
28bab8
     DD_DONT_WAIT_FOR_LOCK = (1 << 5),
28bab8
+    /* Create the new dump directory with parent directories (mkdir -p)*/
28bab8
+    DD_CREATE_PARENTS = (1 << 6),
28bab8
 };
28bab8
 
28bab8
 struct dump_dir {
28bab8
@@ -60,7 +62,7 @@ struct dump_dir {
28bab8
 void dd_close(struct dump_dir *dd);
28bab8
 
28bab8
 struct dump_dir *dd_opendir(const char *dir, int flags);
28bab8
-struct dump_dir *dd_create_skeleton(const char *dir, uid_t uid, mode_t mode);
28bab8
+struct dump_dir *dd_create_skeleton(const char *dir, uid_t uid, mode_t mode, int flags);
28bab8
 int dd_reset_ownership(struct dump_dir *dd);
28bab8
 /* Pass uid = (uid_t)-1L to disable chown'ing of newly created files
28bab8
  * (IOW: if you aren't running under root):
28bab8
diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c
28bab8
index fabad0b..2a65100 100644
28bab8
--- a/src/lib/dump_dir.c
28bab8
+++ b/src/lib/dump_dir.c
28bab8
@@ -514,7 +514,7 @@ struct dump_dir *dd_opendir(const char *dir, int flags)
28bab8
  *     this runs under 0:0
28bab8
  *     - clients: setroubleshootd, abrt python
28bab8
  */
28bab8
-struct dump_dir *dd_create_skeleton(const char *dir, uid_t uid, mode_t mode)
28bab8
+struct dump_dir *dd_create_skeleton(const char *dir, uid_t uid, mode_t mode, int flags)
28bab8
 {
28bab8
     /* a little trick to copy read bits from file mode to exec bit of dir mode*/
28bab8
     mode_t dir_mode = mode | ((mode & 0444) >> 2);
28bab8
@@ -547,7 +547,13 @@ struct dump_dir *dd_create_skeleton(const char *dir, uid_t uid, mode_t mode)
28bab8
      * the user to replace any file in the directory, changing security-sensitive data
28bab8
      * (e.g. "uid", "analyzer", "executable")
28bab8
      */
28bab8
-    if (g_mkdir_with_parents(dd->dd_dirname, dir_mode) != 0)
28bab8
+    int r;
28bab8
+    if ((flags & DD_CREATE_PARENTS))
28bab8
+        r = g_mkdir_with_parents(dd->dd_dirname, dir_mode);
28bab8
+    else
28bab8
+        r = mkdir(dd->dd_dirname, dir_mode);
28bab8
+
28bab8
+    if (r != 0)
28bab8
     {
28bab8
         perror_msg("Can't create directory '%s'", dir);
28bab8
         dd_close(dd);
28bab8
@@ -627,7 +633,7 @@ int dd_reset_ownership(struct dump_dir *dd)
28bab8
  */
28bab8
 struct dump_dir *dd_create(const char *dir, uid_t uid, mode_t mode)
28bab8
 {
28bab8
-    struct dump_dir *dd = dd_create_skeleton(dir, uid, mode);
28bab8
+    struct dump_dir *dd = dd_create_skeleton(dir, uid, mode, DD_CREATE_PARENTS);
28bab8
     if (dd == NULL)
28bab8
         return NULL;
28bab8
 
28bab8
-- 
28bab8
1.8.3.1
28bab8