100-env_memleak.patch 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. diff -Naur a/action.c b/action.c
  2. --- a/action.c 2009-11-18 13:15:21.000000000 +0000
  3. +++ b/action.c 2009-11-18 13:11:19.000000000 +0000
  4. @@ -31,6 +31,30 @@
  5. }
  6. /**
  7. + * Creates a "key=value" string from the given key and value
  8. + *
  9. + * @1 Key
  10. + * @2 Value
  11. + *
  12. + * Returns: Newly allocated string in "key=value" form
  13. + *
  14. + */
  15. +static char* alloc_env(const char *key, const char *value) {
  16. + size_t keylen, vallen;
  17. + char *combined;
  18. +
  19. + keylen = strlen(key);
  20. + vallen = strlen(value) + 1;
  21. +
  22. + combined = xmalloc(keylen + vallen + 1);
  23. + memcpy(combined, key, keylen);
  24. + combined[keylen] = '=';
  25. + memcpy(&combined[keylen + 1], value, vallen);
  26. +
  27. + return combined;
  28. +}
  29. +
  30. +/**
  31. * Choose what action should be taken according to passed settings.
  32. *
  33. * @1 Hotplug settings
  34. @@ -41,16 +65,25 @@
  35. */
  36. void action_perform(struct settings_t *settings, struct uevent_t *event) {
  37. int i;
  38. + char **env;
  39. +
  40. + env = xmalloc(sizeof(char *) * event->env_vars_c);
  41. +
  42. + for (i = 0; i < event->env_vars_c; i++) {
  43. + env[i] = alloc_env(event->env_vars[i].key, event->env_vars[i].value);
  44. + putenv(env[i]);
  45. + }
  46. - for (i = 0; i < event->env_vars_c; i++)
  47. - setenv(event->env_vars[i].key, event->env_vars[i].value, 1);
  48. -
  49. if (settings->dumb == 0) {
  50. ruleset_execute(&settings->rules, event, settings);
  51. } else {
  52. action_dumb(settings, event);
  53. }
  54. - for (i = 0; i < event->env_vars_c; i++)
  55. + for (i = 0; i < event->env_vars_c; i++) {
  56. unsetenv(event->env_vars[i].key);
  57. + free(env[i]);
  58. + }
  59. +
  60. + free(env);
  61. }