diff options
Diffstat (limited to 'package/hotplug2/patches/100-env_memleak.patch')
-rw-r--r-- | package/hotplug2/patches/100-env_memleak.patch | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/package/hotplug2/patches/100-env_memleak.patch b/package/hotplug2/patches/100-env_memleak.patch new file mode 100644 index 000000000..31f404029 --- /dev/null +++ b/package/hotplug2/patches/100-env_memleak.patch @@ -0,0 +1,64 @@ +diff -Naur a/action.c b/action.c +--- a/action.c 2009-11-18 13:15:21.000000000 +0000 ++++ b/action.c 2009-11-18 13:11:19.000000000 +0000 +@@ -31,6 +31,30 @@ + } + + /** ++ * Creates a "key=value" string from the given key and value ++ * ++ * @1 Key ++ * @2 Value ++ * ++ * Returns: Newly allocated string in "key=value" form ++ * ++ */ ++static char* alloc_env(const char *key, const char *value) { ++ size_t keylen, vallen; ++ char *combined; ++ ++ keylen = strlen(key); ++ vallen = strlen(value) + 1; ++ ++ combined = xmalloc(keylen + vallen + 1); ++ memcpy(combined, key, keylen); ++ combined[keylen] = '='; ++ memcpy(&combined[keylen + 1], value, vallen); ++ ++ return combined; ++} ++ ++/** + * Choose what action should be taken according to passed settings. + * + * @1 Hotplug settings +@@ -41,16 +65,25 @@ + */ + void action_perform(struct settings_t *settings, struct uevent_t *event) { + int i; ++ char **env; ++ ++ env = xmalloc(sizeof(char *) * event->env_vars_c); ++ ++ for (i = 0; i < event->env_vars_c; i++) { ++ env[i] = alloc_env(event->env_vars[i].key, event->env_vars[i].value); ++ putenv(env[i]); ++ } + +- for (i = 0; i < event->env_vars_c; i++) +- setenv(event->env_vars[i].key, event->env_vars[i].value, 1); +- + if (settings->dumb == 0) { + ruleset_execute(&settings->rules, event, settings); + } else { + action_dumb(settings, event); + } + +- for (i = 0; i < event->env_vars_c; i++) ++ for (i = 0; i < event->env_vars_c; i++) { + unsetenv(event->env_vars[i].key); ++ free(env[i]); ++ } ++ ++ free(env); + } |