]> granicus.if.org Git - shadow/commitdiff
* libmisc/cleanup.c: Spawn children should no trigger cleanup
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 18 Sep 2011 20:43:28 +0000 (20:43 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 18 Sep 2011 20:43:28 +0000 (20:43 +0000)
actions. Make sure only the parent (initial caller) perform the
cleanup actions.

ChangeLog
libmisc/cleanup.c

index 754763e4b9303bcb3afc6a6ca2dc01057a0b50e1..4edc6356aee2c97c0b18ac2da9635b4abffce88e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-09-18  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * libmisc/cleanup.c: Spawn children should no trigger cleanup
+       actions. Make sure only the parent (initial caller) perform the
+       cleanup actions.
+
 2011-09-18  Nicolas François  <nicolas.francois@centraliens.net>
 
        * libmisc/salt.c (SHA_salt_rounds): It is statically ensured that
index 60f38e98d78c8cbc17730ab2807d396da58805bd..def7c475720dfa8f3ac83047221fed9215486106 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008       , Nicolas François
+ * Copyright (c) 2008 - 2011, Nicolas François
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,6 +40,7 @@
 #define CLEANUP_FUNCTIONS 10
 static cleanup_function cleanup_functions[CLEANUP_FUNCTIONS];
 static void * cleanup_function_args[CLEANUP_FUNCTIONS];
+static pid_t cleanup_pid = 0;
 
 /*
  * - Cleanup functions shall not fail.
@@ -53,6 +54,9 @@ static void * cleanup_function_args[CLEANUP_FUNCTIONS];
 /*
  * do_cleanups - perform the actions stored in the cleanup_functions stack.
  *
+ * Cleanup action are not executed on exit of the processes started by the
+ * parent (first caller of add_cleanup).
+ *
  * It is intended to be used as:
  *     atexit (do_cleanups);
  */
@@ -63,6 +67,10 @@ void do_cleanups (void)
        /* Make sure there were no overflow */
        assert (NULL == cleanup_functions[CLEANUP_FUNCTIONS-1]);
 
+       if (getpid () != cleanup_pid) {
+               return;
+       }
+
        i = CLEANUP_FUNCTIONS;
        do {
                i--;
@@ -82,6 +90,10 @@ void add_cleanup (cleanup_function pcf, /*@null@*/void *arg)
 
        assert (NULL == cleanup_functions[CLEANUP_FUNCTIONS-2]);
 
+       if (0 == cleanup_pid) {
+               cleanup_pid = getpid ();
+       }
+
        /* Add the cleanup_function at the end of the stack */
        for (i=0; NULL != cleanup_functions[i]; i++);
        cleanup_functions[i] = pcf;