100-env_memleak.patch 1.4 KB

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