From db983479afdb0daddcb1cafcd609f4bce23fc993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 10 May 2018 01:04:53 +0200 Subject: [PATCH] shared/sleep-config: fix memleak of strv, add test CID #1390921, #1390951. --- src/shared/sleep-config.c | 11 ++++------- src/test/test-sleep.c | 8 ++++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/shared/sleep-config.c b/src/shared/sleep-config.c index fba58ef367..efc547b6c0 100644 --- a/src/shared/sleep-config.c +++ b/src/shared/sleep-config.c @@ -34,7 +34,7 @@ int parse_sleep_config(const char *verb, char ***_modes, char ***_states, usec_t **suspend_mode = NULL, **suspend_state = NULL, **hibernate_mode = NULL, **hibernate_state = NULL, **hybrid_mode = NULL, **hybrid_state = NULL; - char **modes, **states; + _cleanup_strv_free_ char **modes, **states; /* always initialized below */ usec_t delay = 180 * USEC_PER_MINUTE; const ConfigTableItem items[] = { @@ -90,16 +90,13 @@ int parse_sleep_config(const char *verb, char ***_modes, char ***_states, usec_t assert_not_reached("what verb"); if ((!modes && STR_IN_SET(verb, "hibernate", "hybrid-sleep")) || - (!states && !streq(verb, "suspend-then-hibernate"))) { - strv_free(modes); - strv_free(states); + (!states && !streq(verb, "suspend-then-hibernate"))) return log_oom(); - } if (_modes) - *_modes = modes; + *_modes = TAKE_PTR(modes); if (_states) - *_states = states; + *_states = TAKE_PTR(states); if (_delay) *_delay = delay; diff --git a/src/test/test-sleep.c b/src/test/test-sleep.c index c2cb4ef949..1c5b56f4a0 100644 --- a/src/test/test-sleep.c +++ b/src/test/test-sleep.c @@ -14,6 +14,13 @@ #include "strv.h" #include "util.h" +static void test_parse_sleep_config(void) { + const char *verb; + + FOREACH_STRING(verb, "suspend", "hibernate", "hybrid-sleep", "suspend-then-hibernate") + assert_se(parse_sleep_config(verb, NULL, NULL, NULL) == 0); +} + static int test_fiemap(const char *path) { _cleanup_free_ struct fiemap *fiemap = NULL; _cleanup_close_ int fd = -1; @@ -84,6 +91,7 @@ int main(int argc, char* argv[]) { if (getuid() != 0) log_warning("This program is unlikely to work for unprivileged users"); + test_parse_sleep_config(); test_sleep(); if (argc <= 1)