summaryrefslogtreecommitdiff
path: root/src/systemctl
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2015-09-24 12:30:05 +0200
committerLennart Poettering <lennart@poettering.net>2015-09-29 21:55:52 +0200
commit172d7abfea003d84d0e697a510a222f32b40f4c0 (patch)
tree6dbc20b80d7656618e4aeffb9860f91b7adf8b01 /src/systemctl
parentfc2ffaf17d69fbe58183b2bdd61a655d575d8b0f (diff)
systemctl: allocate arg_wall only on the heap
Previously, we'd allocate it sometimes from the heap, but otherwise let it point directly int argv[]. Let's clean this up, so that we know exactly how to release its resources, and do so at the end.
Diffstat (limited to 'src/systemctl')
-rw-r--r--src/systemctl/systemctl.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index ecd4c01858..804f485403 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -6835,6 +6835,7 @@ static int shutdown_parse_argv(int argc, char *argv[]) {
{}
};
+ char **wall = NULL;
int c, r;
assert(argc >= 0);
@@ -6908,10 +6909,16 @@ static int shutdown_parse_argv(int argc, char *argv[]) {
if (argc > optind && arg_action == ACTION_CANCEL_SHUTDOWN)
/* No time argument for shutdown cancel */
- arg_wall = argv + optind;
+ wall = argv + optind;
else if (argc > optind + 1)
/* We skip the time argument */
- arg_wall = argv + optind + 1;
+ wall = argv + optind + 1;
+
+ if (wall) {
+ arg_wall = strv_copy(wall);
+ if (!arg_wall)
+ return log_oom();
+ }
optind = argc;
@@ -7639,6 +7646,8 @@ finish:
strv_free(arg_states);
strv_free(arg_properties);
+ strv_free(arg_wall);
+
sd_bus_default_flush_close();
return r < 0 ? EXIT_FAILURE : r;