Jiri 891ef4
From c138894ba3f3e630d7e1af398fcd93ffa862659d Mon Sep 17 00:00:00 2001
Jiri 891ef4
From: Denys Vlasenko <dvlasenk@redhat.com>
Jiri 891ef4
Date: Wed, 7 Dec 2011 13:58:25 +0100
Jiri 891ef4
Subject: [PATCH 3/5] abrtd: fix potential problem with exitcode check on
Jiri 891ef4
 "post-create"
Jiri 891ef4
Jiri 891ef4
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Jiri 891ef4
---
Jiri 891ef4
 src/daemon/abrtd.c |   53 ++++++++++++++++++++++++++-------------------------
Jiri 891ef4
 1 files changed, 27 insertions(+), 26 deletions(-)
Jiri 891ef4
Jiri 891ef4
diff --git a/src/daemon/abrtd.c b/src/daemon/abrtd.c
Jiri 891ef4
index d3a759a..743e40f 100644
Jiri 891ef4
--- a/src/daemon/abrtd.c
Jiri 891ef4
+++ b/src/daemon/abrtd.c
Jiri 891ef4
@@ -313,9 +313,10 @@ static mw_result_t run_post_create_and_load_data(const char *dump_dir_name, prob
Jiri 891ef4
     /* Prevent having zombie child process */
Jiri 891ef4
     int status;
Jiri 891ef4
     safe_waitpid(child, &status, 0);
Jiri 891ef4
-    status = WEXITSTATUS(status);
Jiri 891ef4
+    /* status = WEXITSTATUS(status); - wrong, we need to check WIFEXITED too */
Jiri 891ef4
 
Jiri 891ef4
-    /* exit 0 means, this is a good, non-dup dir */
Jiri 891ef4
+    /* exit 0 means "this is a good, non-dup dir" */
Jiri 891ef4
+    /* exit with 1 + "DUP_OF_DIR: dir" string => dup */
Jiri 891ef4
     if (status != 0)
Jiri 891ef4
     {
Jiri 891ef4
         if (!dup_of_dir)
Jiri 891ef4
@@ -330,34 +331,34 @@ static mw_result_t run_post_create_and_load_data(const char *dump_dir_name, prob
Jiri 891ef4
      * else: MW_ERROR
Jiri 891ef4
      */
Jiri 891ef4
     mw_result_t res = MW_ERROR;
Jiri 891ef4
+    struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
Jiri 891ef4
+    if (!dd)
Jiri 891ef4
+        /* dd_opendir already emitted error msg */
Jiri 891ef4
+        goto ret;
Jiri 891ef4
+
Jiri 891ef4
+    /* Reset mode/uig/gid to correct values for all files created by event run */
Jiri 891ef4
+    dd_sanitize_mode_and_owner(dd);
Jiri 891ef4
+
Jiri 891ef4
+    /* Update count */
Jiri 891ef4
+    char *count_str = dd_load_text_ext(dd, FILENAME_COUNT, DD_FAIL_QUIETLY_ENOENT);
Jiri 891ef4
+    unsigned long count = strtoul(count_str, NULL, 10);
Jiri 891ef4
+    count++;
Jiri 891ef4
+    char new_count_str[sizeof(long)*3 + 2];
Jiri 891ef4
+    sprintf(new_count_str, "%lu", count);
Jiri 891ef4
+    dd_save_text(dd, FILENAME_COUNT, new_count_str);
Jiri 891ef4
+    dd_close(dd);
Jiri 891ef4
+
Jiri 891ef4
+    *problem_data = load_problem_data(dump_dir_name);
Jiri 891ef4
+    if (*problem_data != NULL)
Jiri 891ef4
     {
Jiri 891ef4
-        struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
Jiri 891ef4
-        if (!dd)
Jiri 891ef4
-            goto ret;
Jiri 891ef4
-
Jiri 891ef4
-        /* Reset mode/uig/gid to correct values for all files created by event run */
Jiri 891ef4
-        dd_sanitize_mode_and_owner(dd);
Jiri 891ef4
-
Jiri 891ef4
-        /* Update count */
Jiri 891ef4
-        char *count_str = dd_load_text_ext(dd, FILENAME_COUNT, DD_FAIL_QUIETLY_ENOENT);
Jiri 891ef4
-        unsigned long count = strtoul(count_str, NULL, 10);
Jiri 891ef4
-        count++;
Jiri 891ef4
-        char new_count_str[sizeof(long)*3 + 2];
Jiri 891ef4
-        sprintf(new_count_str, "%lu", count);
Jiri 891ef4
-        dd_save_text(dd, FILENAME_COUNT, new_count_str);
Jiri 891ef4
-        dd_close(dd);
Jiri 891ef4
-
Jiri 891ef4
-        *problem_data = load_problem_data(dump_dir_name);
Jiri 891ef4
-        if (*problem_data != NULL)
Jiri 891ef4
+        res = MW_OK;
Jiri 891ef4
+        if (count > 1)
Jiri 891ef4
         {
Jiri 891ef4
-            res = MW_OK;
Jiri 891ef4
-            if (count > 1)
Jiri 891ef4
-            {
Jiri 891ef4
-                log("Problem directory is a duplicate of %s", dump_dir_name);
Jiri 891ef4
-                res = MW_OCCURRED;
Jiri 891ef4
-            }
Jiri 891ef4
+            log("Problem directory is a duplicate of %s", dump_dir_name);
Jiri 891ef4
+            res = MW_OCCURRED;
Jiri 891ef4
         }
Jiri 891ef4
     }
Jiri 891ef4
+    /* else: load_problem_data already emitted error msg */
Jiri 891ef4
 
Jiri 891ef4
  ret:
Jiri 891ef4
     free(dup_of_dir);
Jiri 891ef4
-- 
Jiri 891ef4
1.7.7.3
Jiri 891ef4