Changeset 35857


Ignore:
Timestamp:
2013-03-03T14:56:36+01:00 (5 years ago)
Author:
nbd
Message:

hotplug2: fix a memory leak and wrong variables leaking into the fork worker process (#12436, maybe also #12765)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/hotplug2/patches/140-worker_fork_fix.patch

    r35856 r35857  
    142142                                child = ctx->children[i]; 
    143143                                break; 
    144 @@ -406,21 +484,37 @@ static int worker_fork_process(void *in_ 
     144@@ -406,21 +484,40 @@ static int worker_fork_process(void *in_ 
    145145                 * No child process is currently available. 
    146146                 */ 
    147147                if (child == NULL) { 
     148+                       bool is_slow; 
     149+ 
    148150+                       env = xmalloc(sizeof(char *) * node->uevent->env_vars_c); 
    149151+                       for (i = 0; i < node->uevent->env_vars_c; i++) { 
     
    152154+                       } 
    153155+ 
     156+                       is_slow = !!(ruleset_flags(&ctx->settings->rules, node->uevent) & FLAG_MASK_SLOW); 
     157+ 
     158+                       for (i = 0; i < node->uevent->env_vars_c; i++) { 
     159+                               unsetenv(node->uevent->env_vars[i].key); 
     160+                               free(env[i]); 
     161+                       } 
     162+                       free(env); 
     163+ 
    154164                        /* 
    155165                         * Are the matching rules trivial enough that we 
    156166                         * can execute them in the main process? 
    157167                         */ 
    158                         if (ctx->always_fork == 0 && ctx->settings->dumb == 0 &&  
     168-                       if (ctx->always_fork == 0 && ctx->settings->dumb == 0 &&  
    159169-                       (ruleset_flags(&ctx->settings->rules, uevent) & FLAG_MASK_SLOW) == 0) { 
    160170-                               action_perform(ctx->settings, uevent); 
    161 +                       (ruleset_flags(&ctx->settings->rules, node->uevent) & FLAG_MASK_SLOW) == 0) { 
     171+                       if (ctx->always_fork == 0 && ctx->settings->dumb == 0 && !is_slow) { 
    162172+                               action_perform(ctx->settings, node->uevent); 
    163173+                               walker = walker->next; 
     
    171181                         * We have to fork off a new child. 
    172182                         */ 
    173 -                       if (ctx->children_count < ctx->max_children) 
    174 +                       if (ctx->children_count < ctx->max_children || 
    175 +                       (ruleset_flags(&ctx->settings->rules, node->uevent) & FLAG_SLOW)) 
     183                        if (ctx->children_count < ctx->max_children) 
    176184                                child = worker_fork_spawn(ctx); 
    177185+ 
    178 +                       for (i = 0; i < node->uevent->env_vars_c; i++) { 
    179 +                               unsetenv(node->uevent->env_vars[i].key); 
    180 +                               free(env[i]); 
    181 +                       } 
    182 +                       free(env); 
    183186                } 
    184187  
    185188                /* 
    186 @@ -428,9 +522,14 @@ static int worker_fork_process(void *in_ 
     189@@ -428,9 +525,14 @@ static int worker_fork_process(void *in_ 
    187190                 */ 
    188191                if (child != NULL) { 
     
    215218--- a/workers/worker_fork.h 
    216219+++ b/workers/worker_fork.h 
    217 @@ -35,4 +35,9 @@ struct worker_fork_ctx_t { 
     220@@ -5,6 +5,7 @@ 
     221 #include <sys/types.h> 
     222 #include <sys/select.h> 
     223 #include <unistd.h> 
     224+#include <stdbool.h> 
     225  
     226 #include "../rules/execution.h" 
     227  
     228@@ -35,4 +36,9 @@ struct worker_fork_ctx_t { 
    218229        struct settings_t                       *settings; 
    219230 }; 
Note: See TracChangeset for help on using the changeset viewer.