Blame SOURCES/0020-lib-dump_dir-Clean-up-on-failure-in-dd_delete.patch

9aee9a
From 69c83b933da2ac7c4a1450c5882027030eb79022 Mon Sep 17 00:00:00 2001
9aee9a
From: Ernestas Kulik <ekulik@redhat.com>
9aee9a
Date: Tue, 12 Mar 2019 13:30:12 +0100
9aee9a
Subject: [PATCH] lib: dump_dir: Clean up on failure in dd_delete()
9aee9a
9aee9a
All callers assume that dd_delete() will succeed and the dump directory
9aee9a
struct will be freed, but in some cases that does not happen and leaks
9aee9a
occur.
9aee9a
9aee9a
Resolves rhbz#1671233
9aee9a
9aee9a
Signed-off-by: Ernestas Kulik <ekulik@redhat.com>
9aee9a
---
9aee9a
 src/lib/dump_dir.c | 26 +++++++++++++++++++++-----
9aee9a
 1 file changed, 21 insertions(+), 5 deletions(-)
9aee9a
9aee9a
diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c
9aee9a
index 632a01fa..4533f4c1 100644
9aee9a
--- a/src/lib/dump_dir.c
9aee9a
+++ b/src/lib/dump_dir.c
9aee9a
@@ -1555,19 +1555,33 @@ static int dd_delete_meta_data(struct dump_dir *dd)
9aee9a
 
9aee9a
 int dd_delete(struct dump_dir *dd)
9aee9a
 {
9aee9a
+    int retval;
9aee9a
+
9aee9a
+    retval = 0;
9aee9a
+
9aee9a
     if (!dd->locked)
9aee9a
     {
9aee9a
         error_msg("unlocked problem directory %s cannot be deleted", dd->dd_dirname);
9aee9a
-        return -1;
9aee9a
+
9aee9a
+        retval = -1;
9aee9a
+
9aee9a
+        goto close;
9aee9a
     }
9aee9a
 
9aee9a
     if (dd_delete_meta_data(dd) != 0)
9aee9a
-        return -2;
9aee9a
+    {
9aee9a
+        retval = -2;
9aee9a
+
9aee9a
+        goto close;
9aee9a
+    }
9aee9a
 
9aee9a
     if (delete_file_dir(dd->dd_fd, /*skip_lock_file:*/ true) != 0)
9aee9a
     {
9aee9a
         perror_msg("Can't remove contents of directory '%s'", dd->dd_dirname);
9aee9a
-        return -2;
9aee9a
+
9aee9a
+        retval = -2;
9aee9a
+
9aee9a
+        goto close;
9aee9a
     }
9aee9a
 
9aee9a
     unsigned cnt = RMDIR_FAIL_COUNT;
9aee9a
@@ -1586,12 +1600,14 @@ int dd_delete(struct dump_dir *dd)
9aee9a
     if (cnt == 0)
9aee9a
     {
9aee9a
         perror_msg("Can't remove directory '%s'", dd->dd_dirname);
9aee9a
-        return -3;
9aee9a
+
9aee9a
+        retval = -3;
9aee9a
     }
9aee9a
 
9aee9a
     dd->locked = 0; /* delete_file_dir already removed .lock */
9aee9a
+close:
9aee9a
     dd_close(dd);
9aee9a
-    return 0;
9aee9a
+    return retval;
9aee9a
 }
9aee9a
 
9aee9a
 int dd_chown(struct dump_dir *dd, uid_t new_uid)
9aee9a
-- 
9aee9a
2.21.0
9aee9a