diff --git a/src/core/device.c b/src/core/device.c index 444286e02b..2c41c7b6f4 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -220,7 +220,7 @@ static int device_make_description(Unit *u, struct udev_device *dev, const char static int device_add_udev_wants(Unit *u, struct udev_device *dev) { const char *wants; - char *state, *w; + const char *word, *state; size_t l; int r; @@ -234,11 +234,11 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) { if (!wants) return 0; - FOREACH_WORD_QUOTED(w, l, wants, state) { + FOREACH_WORD_QUOTED(word, l, wants, state) { _cleanup_free_ char *n = NULL; char e[l+1]; - memcpy(e, w, l); + memcpy(e, word, l); e[l] = 0; n = unit_name_mangle(e, MANGLE_NOGLOB); @@ -393,13 +393,13 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) { * aliases */ alias = udev_device_get_property_value(dev, "SYSTEMD_ALIAS"); if (alias) { - char *state, *w; + const char *word, *state; size_t l; - FOREACH_WORD_QUOTED(w, l, alias, state) { + FOREACH_WORD_QUOTED(word, l, alias, state) { char e[l+1]; - memcpy(e, w, l); + memcpy(e, word, l); e[l] = 0; if (path_is_absolute(e)) diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 6d8431015d..b0448e2c4b 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -97,18 +97,18 @@ int config_parse_unit_deps(const char* unit, UnitDependency d = ltype; Unit *u = userdata; - char *w, *state; + const char *word, *state; size_t l; assert(filename); assert(lvalue); assert(rvalue); - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { _cleanup_free_ char *t = NULL, *k = NULL; int r; - t = strndup(w, l); + t = strndup(word, l); if (!t) return log_oom(); @@ -227,7 +227,8 @@ int config_parse_unit_path_strv_printf( void *data, void *userdata) { - char *w, *state, ***x = data; + char ***x = data; + const char *word, *state; Unit *u = userdata; size_t l; int r; @@ -237,11 +238,11 @@ int config_parse_unit_path_strv_printf( assert(rvalue); assert(u); - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { _cleanup_free_ char *k = NULL; char t[l+1]; - memcpy(t, w, l); + memcpy(t, word, l); t[l] = 0; r = unit_full_printf(u, t, &k); @@ -533,9 +534,8 @@ int config_parse_exec(const char *unit, * overriding of argv[0]. */ for (;;) { int i; - char *w; + const char *word, *state; size_t l; - char *state; bool honour_argv0 = false, ignore = false; path = NULL; @@ -566,8 +566,8 @@ int config_parse_exec(const char *unit, } k = 0; - FOREACH_WORD_QUOTED(w, l, rvalue, state) { - if (strneq(w, ";", MAX(l, 1U))) + FOREACH_WORD_QUOTED(word, l, rvalue, state) { + if (strneq(word, ";", MAX(l, 1U))) break; k++; @@ -578,16 +578,16 @@ int config_parse_exec(const char *unit, return log_oom(); k = 0; - FOREACH_WORD_QUOTED(w, l, rvalue, state) { - if (strneq(w, ";", MAX(l, 1U))) + FOREACH_WORD_QUOTED(word, l, rvalue, state) { + if (strneq(word, ";", MAX(l, 1U))) break; - else if (strneq(w, "\\;", MAX(l, 1U))) - w ++; + else if (strneq(word, "\\;", MAX(l, 1U))) + word ++; - if (honour_argv0 && w == rvalue) { + if (honour_argv0 && word == rvalue) { assert(!path); - path = strndup(w, l); + path = strndup(word, l); if (!path) { r = log_oom(); goto fail; @@ -602,7 +602,7 @@ int config_parse_exec(const char *unit, } else { char *c; - c = n[k++] = cunescape_length(w, l); + c = n[k++] = cunescape_length(word, l); if (!c) { r = log_oom(); goto fail; @@ -854,9 +854,8 @@ int config_parse_exec_cpu_affinity(const char *unit, void *userdata) { ExecContext *c = data; - char *w; + const char *word, *state; size_t l; - char *state; assert(filename); assert(lvalue); @@ -871,12 +870,12 @@ int config_parse_exec_cpu_affinity(const char *unit, return 0; } - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { _cleanup_free_ char *t = NULL; int r; unsigned cpu; - t = strndup(w, l); + t = strndup(word, l); if (!t) return log_oom(); @@ -945,9 +944,8 @@ int config_parse_exec_secure_bits(const char *unit, void *userdata) { ExecContext *c = data; - char *w; size_t l; - char *state; + const char *word, *state; assert(filename); assert(lvalue); @@ -960,18 +958,18 @@ int config_parse_exec_secure_bits(const char *unit, return 0; } - FOREACH_WORD_QUOTED(w, l, rvalue, state) { - if (first_word(w, "keep-caps")) + FOREACH_WORD_QUOTED(word, l, rvalue, state) { + if (first_word(word, "keep-caps")) c->secure_bits |= 1<secure_bits |= 1<secure_bits |= 1<secure_bits |= 1<secure_bits |= 1<secure_bits |= 1<address_families_whitelist = !invert; } - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { _cleanup_free_ char *t = NULL; int af; - t = strndup(w, l); + t = strndup(word, l); if (!t) return log_oom(); @@ -2874,7 +2870,8 @@ int config_parse_runtime_directory( void *data, void *userdata) { - char***rt = data, *w, *state; + char***rt = data; + const char *word, *state; size_t l; int r; @@ -2890,10 +2887,10 @@ int config_parse_runtime_directory( return 0; } - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { _cleanup_free_ char *n; - n = strndup(w, l); + n = strndup(word, l); if (!n) return log_oom(); @@ -2924,9 +2921,8 @@ int config_parse_set_status( void *data, void *userdata) { - char *w; size_t l; - char *state; + const char *word, *state; int r; ExitStatusSet *status_set = data; @@ -2941,11 +2937,11 @@ int config_parse_set_status( return 0; } - FOREACH_WORD(w, l, rvalue, state) { + FOREACH_WORD(word, l, rvalue, state) { _cleanup_free_ char *temp; int val; - temp = strndup(w, l); + temp = strndup(word, l); if (!temp) return log_oom(); @@ -2960,11 +2956,11 @@ int config_parse_set_status( r = set_put(status_set->signal, INT_TO_PTR(val)); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, -r, "Unable to store: %s", w); + log_syntax(unit, LOG_ERR, filename, line, -r, "Unable to store: %s", word); return r; } } else { - log_syntax(unit, LOG_ERR, filename, line, -val, "Failed to parse value, ignoring: %s", w); + log_syntax(unit, LOG_ERR, filename, line, -val, "Failed to parse value, ignoring: %s", word); return 0; } } else { @@ -2977,7 +2973,7 @@ int config_parse_set_status( r = set_put(status_set->status, INT_TO_PTR(val)); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, -r, "Unable to store: %s", w); + log_syntax(unit, LOG_ERR, filename, line, -r, "Unable to store: %s", word); return r; } } @@ -2999,7 +2995,8 @@ int config_parse_namespace_path_strv( void *data, void *userdata) { - char*** sv = data, *w, *state; + char*** sv = data; + const char *word, *state; size_t l; int r; @@ -3015,11 +3012,11 @@ int config_parse_namespace_path_strv( return 0; } - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { _cleanup_free_ char *n; int offset; - n = strndup(w, l); + n = strndup(word, l); if (!n) return log_oom(); diff --git a/src/core/main.c b/src/core/main.c index 2741989c48..fad15c7c3f 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -455,9 +455,8 @@ static int config_parse_cpu_affinity2( void *data, void *userdata) { - char *w; + const char *word, *state; size_t l; - char *state; cpu_set_t *c = NULL; unsigned ncpus = 0; @@ -465,12 +464,12 @@ static int config_parse_cpu_affinity2( assert(lvalue); assert(rvalue); - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { char *t; int r; unsigned cpu; - if (!(t = strndup(w, l))) + if (!(t = strndup(word, l))) return log_oom(); r = safe_atou(t, &cpu); @@ -559,7 +558,7 @@ static int config_parse_join_controllers(const char *unit, void *userdata) { unsigned n = 0; - char *state, *w; + const char *word, *state; size_t length; assert(filename); @@ -568,10 +567,10 @@ static int config_parse_join_controllers(const char *unit, free_join_controllers(); - FOREACH_WORD_QUOTED(w, length, rvalue, state) { + FOREACH_WORD_QUOTED(word, length, rvalue, state) { char *s, **l; - s = strndup(w, length); + s = strndup(word, length); if (!s) return log_oom(); diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c index 67dc88fa51..94570eb82d 100644 --- a/src/cryptsetup/cryptsetup.c +++ b/src/cryptsetup/cryptsetup.c @@ -175,16 +175,16 @@ static int parse_one_option(const char *option) { } static int parse_options(const char *options) { - char *state, *w; + const char *word, *state; size_t l; int r; assert(options); - FOREACH_WORD_SEPARATOR(w, l, options, ",", state) { + FOREACH_WORD_SEPARATOR(word, l, options, ",", state) { _cleanup_free_ char *o; - o = strndup(w, l); + o = strndup(word, l); if (!o) return -ENOMEM; r = parse_one_option(o); diff --git a/src/delta/delta.c b/src/delta/delta.c index 96a9fa5ee1..dd7523d473 100644 --- a/src/delta/delta.c +++ b/src/delta/delta.c @@ -488,23 +488,23 @@ static int help(void) { } static int parse_flags(const char *flag_str, int flags) { - char *w, *state; + const char *word, *state; size_t l; - FOREACH_WORD(w, l, flag_str, state) { - if (strneq("masked", w, l)) + FOREACH_WORD(word, l, flag_str, state) { + if (strneq("masked", word, l)) flags |= SHOW_MASKED; - else if (strneq ("equivalent", w, l)) + else if (strneq ("equivalent", word, l)) flags |= SHOW_EQUIVALENT; - else if (strneq("redirected", w, l)) + else if (strneq("redirected", word, l)) flags |= SHOW_REDIRECTED; - else if (strneq("overridden", w, l)) + else if (strneq("overridden", word, l)) flags |= SHOW_OVERRIDDEN; - else if (strneq("unchanged", w, l)) + else if (strneq("unchanged", word, l)) flags |= SHOW_UNCHANGED; - else if (strneq("extended", w, l)) + else if (strneq("extended", word, l)) flags |= SHOW_EXTENDED; - else if (strneq("default", w, l)) + else if (strneq("default", word, l)) flags |= SHOW_DEFAULTS; else return -EINVAL; diff --git a/src/getty-generator/getty-generator.c b/src/getty-generator/getty-generator.c index 7d4b546f72..c78a511f94 100644 --- a/src/getty-generator/getty-generator.c +++ b/src/getty-generator/getty-generator.c @@ -154,14 +154,14 @@ int main(int argc, char *argv[]) { r = getenv_for_pid(1, "container_ttys", &container_ttys); if (r > 0) { - char *w, *state; + const char *word, *state; size_t l; - FOREACH_WORD(w, l, container_ttys, state) { + FOREACH_WORD(word, l, container_ttys, state) { const char *t; char tty[l + 1]; - memcpy(tty, w, l); + memcpy(tty, word, l); tty[l] = 0; /* First strip off /dev/ if it is specified */ @@ -184,15 +184,15 @@ int main(int argc, char *argv[]) { } if (read_one_line_file("/sys/class/tty/console/active", &active) >= 0) { - char *w, *state; + const char *word, *state; size_t l; /* Automatically add in a serial getty on all active * kernel consoles */ - FOREACH_WORD(w, l, active, state) { + FOREACH_WORD(word, l, active, state) { _cleanup_free_ char *tty = NULL; - tty = strndup(w, l); + tty = strndup(word, l); if (!tty) { log_oom(); return EXIT_FAILURE; diff --git a/src/journal-remote/journal-remote.c b/src/journal-remote/journal-remote.c index 37ad9029fd..3249027b63 100644 --- a/src/journal-remote/journal-remote.c +++ b/src/journal-remote/journal-remote.c @@ -1344,7 +1344,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_GNUTLS_LOG: { #ifdef HAVE_GNUTLS - char *word, *state; + const char *word, *state; size_t size; FOREACH_WORD_SEPARATOR(word, size, optarg, ",", state) { diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 4ea9d43c0d..eac0a4ca67 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -1282,7 +1282,7 @@ static int setup_signals(Server *s) { static int server_parse_proc_cmdline(Server *s) { _cleanup_free_ char *line = NULL; - char *w, *state; + const char *w, *state; size_t l; int r; diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 6349aeb785..01c91e4c02 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -997,7 +997,7 @@ _public_ int sd_journal_get_cursor(sd_journal *j, char **cursor) { } _public_ int sd_journal_seek_cursor(sd_journal *j, const char *cursor) { - char *w, *state; + const char *word, *state; size_t l; unsigned long long seqnum, monotonic, realtime, xor_hash; bool @@ -1013,18 +1013,18 @@ _public_ int sd_journal_seek_cursor(sd_journal *j, const char *cursor) { assert_return(!journal_pid_changed(j), -ECHILD); assert_return(!isempty(cursor), -EINVAL); - FOREACH_WORD_SEPARATOR(w, l, cursor, ";", state) { + FOREACH_WORD_SEPARATOR(word, l, cursor, ";", state) { char *item; int k = 0; - if (l < 2 || w[1] != '=') + if (l < 2 || word[1] != '=') return -EINVAL; - item = strndup(w, l); + item = strndup(word, l); if (!item) return -ENOMEM; - switch (w[0]) { + switch (word[0]) { case 's': seqnum_id_set = true; @@ -1103,7 +1103,7 @@ _public_ int sd_journal_seek_cursor(sd_journal *j, const char *cursor) { _public_ int sd_journal_test_cursor(sd_journal *j, const char *cursor) { int r; - char *w, *state; + const char *word, *state; size_t l; Object *o; @@ -1118,20 +1118,20 @@ _public_ int sd_journal_test_cursor(sd_journal *j, const char *cursor) { if (r < 0) return r; - FOREACH_WORD_SEPARATOR(w, l, cursor, ";", state) { + FOREACH_WORD_SEPARATOR(word, l, cursor, ";", state) { _cleanup_free_ char *item = NULL; sd_id128_t id; unsigned long long ll; int k = 0; - if (l < 2 || w[1] != '=') + if (l < 2 || word[1] != '=') return -EINVAL; - item = strndup(w, l); + item = strndup(word, l); if (!item) return -ENOMEM; - switch (w[0]) { + switch (word[0]) { case 's': k = sd_id128_from_string(item+2, &id); diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index 603ee6dbe9..7f744215cc 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -354,7 +354,7 @@ void serialize_in_addrs(FILE *f, const struct in_addr *addresses, size_t size) { int deserialize_in_addrs(struct in_addr **ret, const char *string) { _cleanup_free_ struct in_addr *addresses = NULL; int size = 0; - char *word, *state; + const char *word, *state; size_t len; assert(ret); @@ -391,7 +391,7 @@ int deserialize_in_addrs(struct in_addr **ret, const char *string) { int deserialize_in6_addrs(struct in6_addr **ret, const char *string) { _cleanup_free_ struct in6_addr *addresses = NULL; int size = 0; - char *word, *state; + const char *word, *state; size_t len; assert(ret); @@ -446,7 +446,7 @@ void serialize_dhcp_routes(FILE *f, const char *key, struct sd_dhcp_route *route int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, size_t *ret_allocated, const char *string) { _cleanup_free_ struct sd_dhcp_route *routes = NULL; size_t size = 0, allocated = 0; - char *word, *state; + const char *word, *state; size_t len; assert(ret); diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index 38ff944892..95cb6ff581 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -226,11 +226,10 @@ _public_ int sd_uid_get_display(uid_t uid, char **session) { } _public_ int sd_uid_is_on_seat(uid_t uid, int require_active, const char *seat) { - char *w, *state; _cleanup_free_ char *t = NULL, *s = NULL, *p = NULL; size_t l; int r; - const char *variable; + const char *word, *variable, *state; assert_return(seat, -EINVAL); @@ -251,8 +250,8 @@ _public_ int sd_uid_is_on_seat(uid_t uid, int require_active, const char *seat) if (asprintf(&t, UID_FMT, uid) < 0) return -ENOMEM; - FOREACH_WORD(w, l, s, state) { - if (strneq(t, w, l)) + FOREACH_WORD(word, l, s, state) { + if (strneq(t, word, l)) return 1; } @@ -587,10 +586,10 @@ _public_ int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **ui } if (uids && t) { - char *w, *state; + const char *word, *state; size_t l; - FOREACH_WORD(w, l, t, state) + FOREACH_WORD(word, l, t, state) n++; if (n > 0) { @@ -600,10 +599,10 @@ _public_ int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **ui if (!b) return -ENOMEM; - FOREACH_WORD(w, l, t, state) { + FOREACH_WORD(word, l, t, state) { _cleanup_free_ char *k = NULL; - k = strndup(w, l); + k = strndup(word, l); if (!k) return -ENOMEM; @@ -789,9 +788,8 @@ _public_ int sd_machine_get_class(const char *machine, char **class) { _public_ int sd_machine_get_ifindices(const char *machine, int **ifindices) { _cleanup_free_ char *netif = NULL; size_t l, allocated = 0, nr = 0; - char *w, *state; int *ni = NULL; - const char *p; + const char *p, *word, *state; int r; assert_return(machine_name_is_valid(machine), -EINVAL); @@ -806,11 +804,11 @@ _public_ int sd_machine_get_ifindices(const char *machine, int **ifindices) { return 0; } - FOREACH_WORD(w, l, netif, state) { + FOREACH_WORD(word, l, netif, state) { char buf[l+1]; int ifi; - *(char*) (mempcpy(buf, w, l)) = 0; + *(char*) (mempcpy(buf, word, l)) = 0; if (safe_atoi(buf, &ifi) < 0) continue; diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c index 64a62ffeae..a9e14af8db 100644 --- a/src/login/logind-inhibit.c +++ b/src/login/logind-inhibit.c @@ -439,23 +439,23 @@ const char *inhibit_what_to_string(InhibitWhat w) { InhibitWhat inhibit_what_from_string(const char *s) { InhibitWhat what = 0; - char *w, *state; + const char *word, *state; size_t l; - FOREACH_WORD_SEPARATOR(w, l, s, ":", state) { - if (l == 8 && strneq(w, "shutdown", l)) + FOREACH_WORD_SEPARATOR(word, l, s, ":", state) { + if (l == 8 && strneq(word, "shutdown", l)) what |= INHIBIT_SHUTDOWN; - else if (l == 5 && strneq(w, "sleep", l)) + else if (l == 5 && strneq(word, "sleep", l)) what |= INHIBIT_SLEEP; - else if (l == 4 && strneq(w, "idle", l)) + else if (l == 4 && strneq(word, "idle", l)) what |= INHIBIT_IDLE; - else if (l == 16 && strneq(w, "handle-power-key", l)) + else if (l == 16 && strneq(word, "handle-power-key", l)) what |= INHIBIT_HANDLE_POWER_KEY; - else if (l == 18 && strneq(w, "handle-suspend-key", l)) + else if (l == 18 && strneq(word, "handle-suspend-key", l)) what |= INHIBIT_HANDLE_SUSPEND_KEY; - else if (l == 20 && strneq(w, "handle-hibernate-key", l)) + else if (l == 20 && strneq(word, "handle-hibernate-key", l)) what |= INHIBIT_HANDLE_HIBERNATE_KEY; - else if (l == 17 && strneq(w, "handle-lid-switch", l)) + else if (l == 17 && strneq(word, "handle-lid-switch", l)) what |= INHIBIT_HANDLE_LID_SWITCH; else return _INHIBIT_WHAT_INVALID; diff --git a/src/machine/machine.c b/src/machine/machine.c index 0ed18d74ec..1c9177e1c3 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -291,14 +291,14 @@ int machine_load(Machine *m) { if (netif) { size_t l, allocated = 0, nr = 0; - char *w, *state; + const char *word, *state; int *ni = NULL; - FOREACH_WORD(w, l, netif, state) { + FOREACH_WORD(word, l, netif, state) { char buf[l+1]; int ifi; - *(char*) (mempcpy(buf, w, l)) = 0; + *(char*) (mempcpy(buf, word, l)) = 0; if (safe_atoi(buf, &ifi) < 0) continue; diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 7c47f6ecd2..ddf1c371a0 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -395,7 +395,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_CAPABILITY: case ARG_DROP_CAPABILITY: { - char *state, *word; + const char *state, *word; size_t length; FOREACH_WORD_SEPARATOR(word, length, optarg, ",", state) { @@ -2602,7 +2602,8 @@ static int spawn_getent(const char *database, const char *key, pid_t *rpid) { } static int change_uid_gid(char **_home) { - char line[LINE_MAX], *w, *x, *state, *u, *g, *h; + char line[LINE_MAX], *x, *u, *g, *h; + const char *word, *state; _cleanup_free_ uid_t *uids = NULL; _cleanup_free_ char *home = NULL; _cleanup_fclose_ FILE *f = NULL; @@ -2752,10 +2753,10 @@ static int change_uid_gid(char **_home) { x += strcspn(x, WHITESPACE); x += strspn(x, WHITESPACE); - FOREACH_WORD(w, l, x, state) { + FOREACH_WORD(word, l, x, state) { char c[l+1]; - memcpy(c, w, l); + memcpy(c, word, l); c[l] = 0; if (!GREEDY_REALLOC(uids, sz, n_uids+1)) diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 319baf7887..995621c915 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -304,7 +304,7 @@ static int manager_network_monitor_listen(Manager *m) { } static int parse_dns_server_string(Manager *m, const char *string) { - char *word, *state; + const char *word, *state; size_t length; int r; diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index c1c4d409ae..f683ae990e 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -753,9 +753,9 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) { cs = strlen(controller); FOREACH_LINE(line, f, return -errno) { - char *l, *p, *w, *e; + char *l, *p, *e; size_t k; - char *state; + const char *word, *state; bool found = false; truncate_nl(line); @@ -771,16 +771,16 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) { *e = 0; - FOREACH_WORD_SEPARATOR(w, k, l, ",", state) { + FOREACH_WORD_SEPARATOR(word, k, l, ",", state) { - if (k == cs && memcmp(w, controller, cs) == 0) { + if (k == cs && memcmp(word, controller, cs) == 0) { found = true; break; } if (k == 5 + cs && - memcmp(w, "name=", 5) == 0 && - memcmp(w+5, controller, cs) == 0) { + memcmp(word, "name=", 5) == 0 && + memcmp(word+5, controller, cs) == 0) { found = true; break; } diff --git a/src/shared/condition-util.c b/src/shared/condition-util.c index 928edeeb9d..f88ddc19e2 100644 --- a/src/shared/condition-util.c +++ b/src/shared/condition-util.c @@ -74,7 +74,8 @@ void condition_free_list(Condition *first) { } bool condition_test_kernel_command_line(Condition *c) { - char *line, *w, *state, *word = NULL; + char *line, *word = NULL; + const char *w, *state; bool equal; int r; size_t l, pl; diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 0be7226871..cd189adfc3 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -675,7 +675,8 @@ int config_parse_strv(const char *unit, void *data, void *userdata) { - char *** sv = data, *w, *state; + char ***sv = data; + const char *word, *state; size_t l; int r; @@ -700,10 +701,10 @@ int config_parse_strv(const char *unit, return 0; } - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { char *n; - n = strndup(w, l); + n = strndup(word, l); if (!n) return log_oom(); diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index ea7b710dec..a17dde9069 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -170,7 +170,7 @@ int log_syntax_internal(const char *unit, int level, void *userdata) { \ \ type **enums = data, *xs, x, *ys; \ - char *w, *state; \ + const char *word, *state; \ size_t l, i = 0; \ \ assert(filename); \ @@ -181,10 +181,10 @@ int log_syntax_internal(const char *unit, int level, xs = new0(type, 1); \ *xs = invalid; \ \ - FOREACH_WORD(w, l, rvalue, state) { \ + FOREACH_WORD(word, l, rvalue, state) { \ _cleanup_free_ char *en = NULL; \ \ - en = strndup(w, l); \ + en = strndup(word, l); \ if (!en) \ return -ENOMEM; \ \ diff --git a/src/shared/install.c b/src/shared/install.c index cc61c01e20..c32d6599a6 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -946,20 +946,19 @@ static int config_parse_also( void *data, void *userdata) { - char *w; size_t l; - char *state; + const char *word, *state; InstallContext *c = data; assert(filename); assert(lvalue); assert(rvalue); - FOREACH_WORD_QUOTED(w, l, rvalue, state) { + FOREACH_WORD_QUOTED(word, l, rvalue, state) { _cleanup_free_ char *n; int r; - n = strndup(w, l); + n = strndup(word, l); if (!n) return -ENOMEM; diff --git a/src/shared/log.c b/src/shared/log.c index 3941e3e1c2..a7c3195f39 100644 --- a/src/shared/log.c +++ b/src/shared/log.c @@ -871,11 +871,11 @@ void log_parse_environment(void) { if (r < 0) log_warning("Failed to read /proc/cmdline. Ignoring: %s", strerror(-r)); else if (r > 0) { - char *w, *state; + const char *word, *state; size_t l; - FOREACH_WORD_QUOTED(w, l, line, state) { - if (l == 5 && startswith(w, "debug")) { + FOREACH_WORD_QUOTED(word, l, line, state) { + if (l == 5 && startswith(word, "debug")) { log_set_max_level(LOG_DEBUG); break; } diff --git a/src/shared/path-util.c b/src/shared/path-util.c index 5bc5012fe8..57554cd294 100644 --- a/src/shared/path-util.c +++ b/src/shared/path-util.c @@ -574,7 +574,7 @@ int find_binary(const char *name, char **filename) { return 0; } else { const char *path; - char *state, *w; + const char *word, *state; size_t l; /** @@ -585,10 +585,10 @@ int find_binary(const char *name, char **filename) { if (!path) path = DEFAULT_PATH; - FOREACH_WORD_SEPARATOR(w, l, path, ":", state) { + FOREACH_WORD_SEPARATOR(word, l, path, ":", state) { _cleanup_free_ char *p = NULL; - if (asprintf(&p, "%.*s/%s", (int) l, w, name) < 0) + if (asprintf(&p, "%.*s/%s", (int) l, word, name) < 0) return -ENOMEM; if (access(p, X_OK) < 0) diff --git a/src/shared/sleep-config.c b/src/shared/sleep-config.c index 16a488d56b..d8de644a92 100644 --- a/src/shared/sleep-config.c +++ b/src/shared/sleep-config.c @@ -98,7 +98,7 @@ int parse_sleep_config(const char *verb, char ***_modes, char ***_states) { } int can_sleep_state(char **types) { - char *w, *state, **type; + char **type; int r; _cleanup_free_ char *p = NULL; @@ -114,11 +114,12 @@ int can_sleep_state(char **types) { return false; STRV_FOREACH(type, types) { + const char *word, *state; size_t l, k; k = strlen(*type); - FOREACH_WORD_SEPARATOR(w, l, p, WHITESPACE, state) - if (l == k && memcmp(w, *type, l) == 0) + FOREACH_WORD_SEPARATOR(word, l, p, WHITESPACE, state) + if (l == k && memcmp(word, *type, l) == 0) return true; } @@ -126,7 +127,7 @@ int can_sleep_state(char **types) { } int can_sleep_disk(char **types) { - char *w, *state, **type; + char **type; int r; _cleanup_free_ char *p = NULL; @@ -142,14 +143,18 @@ int can_sleep_disk(char **types) { return false; STRV_FOREACH(type, types) { + const char *word, *state; size_t l, k; k = strlen(*type); - FOREACH_WORD_SEPARATOR(w, l, p, WHITESPACE, state) { - if (l == k && memcmp(w, *type, l) == 0) + FOREACH_WORD_SEPARATOR(word, l, p, WHITESPACE, state) { + if (l == k && memcmp(word, *type, l) == 0) return true; - if (l == k + 2 && w[0] == '[' && memcmp(w + 1, *type, l - 2) == 0 && w[l-1] == ']') + if (l == k + 2 && + word[0] == '[' && + memcmp(word + 1, *type, l - 2) == 0 && + word[l-1] == ']') return true; } } diff --git a/src/shared/strv.c b/src/shared/strv.c index b4c476eff2..0ac66b927c 100644 --- a/src/shared/strv.c +++ b/src/shared/strv.c @@ -201,8 +201,7 @@ int strv_extend_strv_concat(char ***a, char **b, const char *suffix) { } char **strv_split(const char *s, const char *separator) { - char *state; - char *w; + const char *word, *state; size_t l; unsigned n, i; char **r; @@ -210,7 +209,7 @@ char **strv_split(const char *s, const char *separator) { assert(s); n = 0; - FOREACH_WORD_SEPARATOR(w, l, s, separator, state) + FOREACH_WORD_SEPARATOR(word, l, s, separator, state) n++; r = new(char*, n+1); @@ -218,8 +217,8 @@ char **strv_split(const char *s, const char *separator) { return NULL; i = 0; - FOREACH_WORD_SEPARATOR(w, l, s, separator, state) { - r[i] = strndup(w, l); + FOREACH_WORD_SEPARATOR(word, l, s, separator, state) { + r[i] = strndup(word, l); if (!r[i]) { strv_free(r); return NULL; @@ -233,8 +232,7 @@ char **strv_split(const char *s, const char *separator) { } char **strv_split_quoted(const char *s) { - char *state; - char *w; + const char *word, *state; size_t l; unsigned n, i; char **r; @@ -242,16 +240,19 @@ char **strv_split_quoted(const char *s) { assert(s); n = 0; - FOREACH_WORD_QUOTED(w, l, s, state) + FOREACH_WORD_QUOTED(word, l, s, state) n++; + if (*state) + /* bad syntax */ + return NULL; r = new(char*, n+1); if (!r) return NULL; i = 0; - FOREACH_WORD_QUOTED(w, l, s, state) { - r[i] = cunescape_length(w, l); + FOREACH_WORD_QUOTED(word, l, s, state) { + r[i] = cunescape_length(word, l); if (!r[i]) { strv_free(r); return NULL; diff --git a/src/shared/util.c b/src/shared/util.c index d8a75bdc6a..cb9687cb02 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -415,37 +415,50 @@ static size_t strcspn_escaped(const char *s, const char *reject) { else if (s[n] == '\\') escaped = true; else if (strchr(reject, s[n])) - return n; + break; } - return n; + /* if s ends in \, return index of previous char */ + return n - escaped; } /* Split a string into words. */ -char *split(const char *c, size_t *l, const char *separator, bool quoted, char **state) { - char *current; +const char* split(const char **state, size_t *l, const char *separator, bool quoted) { + const char *current; - current = *state ? *state : (char*) c; + current = *state; - if (!*current || *c == 0) + if (!*current) { + assert(**state == '\0'); return NULL; - - current += strspn(current, separator); - if (!*current) - return NULL; - - if (quoted && strchr("\'\"", *current)) { - char quotechar = *(current++); - *l = strcspn_escaped(current, (char[]){quotechar, '\0'}); - *state = current+*l+1; - } else if (quoted) { - *l = strcspn_escaped(current, separator); - *state = current+*l; - } else { - *l = strcspn(current, separator); - *state = current+*l; } - return (char*) current; + current += strspn(current, separator); + if (!*current) { + *state = current; + return NULL; + } + + if (quoted && strchr("\'\"", *current)) { + char quotechars[2] = {*current, '\0'}; + + *l = strcspn_escaped(current + 1, quotechars); + if (current[*l + 1] == '\0' || + (current[*l + 2] && !strchr(separator, current[*l + 2]))) { + /* right quote missing or garbage at the end*/ + *state = current; + return NULL; + } + assert(current[*l + 1] == quotechars[0]); + *state = current++ + *l + 2; + } else if (quoted) { + *l = strcspn_escaped(current, separator); + *state = current + *l; + } else { + *l = strcspn(current, separator); + *state = current + *l; + } + + return current; } int get_parent_of_pid(pid_t pid, pid_t *_ppid) { @@ -6059,7 +6072,7 @@ int split_pair(const char *s, const char *sep, char **l, char **r) { int shall_restore_state(void) { _cleanup_free_ char *line = NULL; - char *w, *state; + const char *word, *state; size_t l; int r; @@ -6071,12 +6084,12 @@ int shall_restore_state(void) { r = 1; - FOREACH_WORD_QUOTED(w, l, line, state) { + FOREACH_WORD_QUOTED(word, l, line, state) { const char *e; char n[l+1]; int k; - memcpy(n, w, l); + memcpy(n, word, l); n[l] = 0; e = startswith(n, "systemd.restore_state="); @@ -6120,7 +6133,7 @@ int proc_cmdline(char **ret) { int parse_proc_cmdline(int (*parse_item)(const char *key, const char *value)) { _cleanup_free_ char *line = NULL; - char *w, *state; + const char *w, *state; size_t l; int r; diff --git a/src/shared/util.h b/src/shared/util.h index 81da59b20c..45294800e4 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -234,7 +234,7 @@ static inline int safe_atoi64(const char *s, int64_t *ret_i) { return safe_atolli(s, (long long int*) ret_i); } -char *split(const char *c, size_t *l, const char *separator, bool quoted, char **state); +const char* split(const char **state, size_t *l, const char *separator, bool quoted); #define FOREACH_WORD(word, length, s, state) \ _FOREACH_WORD(word, length, s, WHITESPACE, false, state) @@ -249,7 +249,7 @@ char *split(const char *c, size_t *l, const char *separator, bool quoted, char * _FOREACH_WORD(word, length, s, separator, true, state) #define _FOREACH_WORD(word, length, s, separator, quoted, state) \ - for ((state) = NULL, (word) = split((s), &(length), (separator), (quoted), &(state)); (word); (word) = split((s), &(length), (separator), (quoted), &(state))) + for ((state) = (s), (word) = split(&(state), &(length), (separator), (quoted)); (word); (word) = split(&(state), &(length), (separator), (quoted))) pid_t get_parent_of_pid(pid_t pid, pid_t *ppid); int get_starttime_of_pid(pid_t pid, unsigned long long *st); diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 4699a670f7..21e33d5bfc 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -5733,7 +5733,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { return 0; case 't': { - char *word, *state; + const char *word, *state; size_t size; FOREACH_WORD_SEPARATOR(word, size, optarg, ",", state) { @@ -5782,7 +5782,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { if (!arg_properties) return log_oom(); } else { - char *word, *state; + const char *word, *state; size_t size; FOREACH_WORD_SEPARATOR(word, size, optarg, ",", state) { @@ -5952,7 +5952,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { break; case ARG_STATE: { - char *word, *state; + const char *word, *state; size_t size; FOREACH_WORD_SEPARATOR(word, size, optarg, ",", state) { diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index 9a869badca..cfae1d75b3 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -442,15 +442,15 @@ static int load_sysv(SysvStub *s) { } else if (state == LSB || state == LSB_DESCRIPTION) { if (startswith_no_case(t, "Provides:")) { - char *i, *w; + const char *word, *state_; size_t z; state = LSB; - FOREACH_WORD_QUOTED(w, z, t+9, i) { + FOREACH_WORD_QUOTED(word, z, t+9, state_) { _cleanup_free_ char *n = NULL, *m = NULL; - n = strndup(w, z); + n = strndup(word, z); if (!n) return -ENOMEM; @@ -499,16 +499,16 @@ static int load_sysv(SysvStub *s) { startswith_no_case(t, "Should-Start:") || startswith_no_case(t, "X-Start-Before:") || startswith_no_case(t, "X-Start-After:")) { - char *i, *w; + const char *word, *state_; size_t z; state = LSB; - FOREACH_WORD_QUOTED(w, z, strchr(t, ':')+1, i) { + FOREACH_WORD_QUOTED(word, z, strchr(t, ':')+1, state_) { _cleanup_free_ char *n = NULL, *m = NULL; bool is_before; - n = strndup(w, z); + n = strndup(word, z); if (!n) return -ENOMEM; diff --git a/src/test/test-strv.c b/src/test/test-strv.c index 370219121b..cdd2a539af 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -159,12 +159,15 @@ static void test_strv_quote_unquote(const char* const *split, const char *quoted static void test_strv_unquote(const char *quoted, const char **list) { _cleanup_strv_free_ char **s; + _cleanup_free_ char *j; unsigned i = 0; char **t; s = strv_split_quoted(quoted); assert_se(s); - strv_print(s); + j = strv_join(s, " | "); + assert(j); + puts(j); STRV_FOREACH(t, s) assert_se(streq(list[i++], *t)); @@ -172,6 +175,13 @@ static void test_strv_unquote(const char *quoted, const char **list) { assert_se(list[i] == NULL); } +static void test_invalid_unquote(const char *quoted) { + char **s; + + s = strv_split_quoted(quoted); + assert(s == NULL); +} + static void test_strv_split(void) { char **s; unsigned i = 0; @@ -428,7 +438,9 @@ int main(int argc, char *argv[]) { test_strv_unquote(" \"x'\" ", (const char*[]) { "x'", NULL }); test_strv_unquote("a '--b=c \"d e\"'", (const char*[]) { "a", "--b=c \"d e\"", NULL }); - test_strv_unquote("a --b='c \"d e\"'", (const char*[]) { "a", "--b='c", "\"d", "e\"'", NULL }); + test_invalid_unquote("a --b='c \"d e\"'"); + test_invalid_unquote("a --b='c \"d e\" '"); + test_invalid_unquote("a --b='c \"d e\"garbage"); test_strv_split(); test_strv_split_newlines(); diff --git a/src/test/test-util.c b/src/test/test-util.c index 9a28ef9eec..a56b355672 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -311,7 +311,7 @@ static void test_cunescape(void) { } static void test_foreach_word(void) { - char *w, *state; + const char *word, *state; size_t l; int i = 0; const char test[] = "test abc d\te f "; @@ -325,13 +325,12 @@ static void test_foreach_word(void) { NULL }; - FOREACH_WORD(w, l, test, state) { - assert_se(strneq(expected[i++], w, l)); - } + FOREACH_WORD(word, l, test, state) + assert_se(strneq(expected[i++], word, l)); } static void test_foreach_word_quoted(void) { - char *w, *state; + const char *word, *state; size_t l; int i = 0; const char test[] = "test a b c 'd' e '' '' hhh '' '' \"a b c\""; @@ -352,11 +351,11 @@ static void test_foreach_word_quoted(void) { }; printf("<%s>\n", test); - FOREACH_WORD_QUOTED(w, l, test, state) { + FOREACH_WORD_QUOTED(word, l, test, state) { _cleanup_free_ char *t = NULL; - assert_se(t = strndup(w, l)); - assert_se(strneq(expected[i++], w, l)); + assert_se(t = strndup(word, l)); + assert_se(strneq(expected[i++], word, l)); printf("<%s>\n", t); } } diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c index b80e03b349..8bb79fb5ee 100644 --- a/src/timesync/timesyncd.c +++ b/src/timesync/timesyncd.c @@ -984,17 +984,17 @@ static int manager_add_server(Manager *m, const char *server) { } static int manager_add_server_string(Manager *m, const char *string) { - char *w, *state; + const char *word, *state; size_t l; int r; assert(m); assert(string); - FOREACH_WORD_QUOTED(w, l, string, state) { + FOREACH_WORD_QUOTED(word, l, string, state) { char t[l+1]; - memcpy(t, w, l); + memcpy(t, word, l); t[l] = 0; r = manager_add_server(m, t); diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 512885f9c8..946715ce5a 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -193,7 +193,7 @@ static int load_link(link_config_ctx *ctx, const char *filename) { static bool enable_name_policy(void) { _cleanup_free_ char *line = NULL; - char *w, *state; + const char *word, *state; int r; size_t l; @@ -203,8 +203,8 @@ static bool enable_name_policy(void) { if (r <= 0) return true; - FOREACH_WORD_QUOTED(w, l, line, state) - if (strneq(w, "net.ifnames=0", l)) + FOREACH_WORD_QUOTED(word, l, line, state) + if (strneq(word, "net.ifnames=0", l)) return false; return true; diff --git a/src/udev/udevd.c b/src/udev/udevd.c index b75145eebf..f882cfb3ad 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -956,7 +956,7 @@ static int systemd_fds(struct udev *udev, int *rctrl, int *rnetlink) { */ static void kernel_cmdline_options(struct udev *udev) { _cleanup_free_ char *line = NULL; - char *w, *state; + const char *word, *state; size_t l; int r; @@ -966,10 +966,10 @@ static void kernel_cmdline_options(struct udev *udev) { if (r <= 0) return; - FOREACH_WORD_QUOTED(w, l, line, state) { + FOREACH_WORD_QUOTED(word, l, line, state) { char *s, *opt; - s = strndup(w, l); + s = strndup(word, l); if (!s) break;