diff --git a/TODO b/TODO index 5a0117260e..32838a4f25 100644 --- a/TODO +++ b/TODO @@ -329,8 +329,6 @@ Features: * rework fopen_temporary() to make use of open_tmpfile_linkable() (problem: the kernel doesn't support linkat() that replaces existing files, currently) -* check if DeviceAllow= should split first, resolve specifiers later - * transient units: don't bother with actually setting unit properties, we reload the unit file anyway diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 5bc7536287..b9b23bb278 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -100,7 +100,7 @@ int config_parse_unit_deps( r = unit_name_printf(u, word, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %m"); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", word); continue; } @@ -153,7 +153,7 @@ int config_parse_unit_string_printf( r = unit_full_printf(u, rvalue, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } @@ -183,7 +183,7 @@ int config_parse_unit_strv_printf( r = unit_full_printf(u, rvalue, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } @@ -223,7 +223,7 @@ int config_parse_unit_path_printf( r = unit_full_printf(u, rvalue, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve unit specifiers in \"%s\"%s: %m", + "Failed to resolve unit specifiers in '%s'%s: %m", rvalue, fatal ? "" : ", ignoring"); return fatal ? -ENOEXEC : 0; } @@ -275,7 +275,7 @@ int config_parse_unit_path_strv_printf( r = unit_full_printf(u, word, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve unit specifiers on \"%s\", ignoring: %m", word); + "Failed to resolve unit specifiers in '%s', ignoring: %m", word); return 0; } @@ -337,7 +337,7 @@ int config_parse_socket_listen(const char *unit, p->type = ltype; r = unit_full_printf(UNIT(s), rvalue, &p->path); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } @@ -349,13 +349,13 @@ int config_parse_socket_listen(const char *unit, p->type = SOCKET_SOCKET; r = unit_full_printf(UNIT(s), rvalue, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } r = socket_address_parse_netlink(&p->address, k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address value, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address value in '%s', ignoring: %m", k); return 0; } @@ -365,14 +365,14 @@ int config_parse_socket_listen(const char *unit, p->type = SOCKET_SOCKET; r = unit_full_printf(UNIT(s), rvalue, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } r = socket_address_parse_and_warn(&p->address, k); if (r < 0) { if (r != -EAFNOSUPPORT) - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address value, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address value in '%s', ignoring: %m", k); return 0; } @@ -426,7 +426,7 @@ int config_parse_socket_protocol(const char *unit, r = socket_protocol_from_name(rvalue); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid socket protocol, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid socket protocol '%s', ignoring: %m", rvalue); return 0; } else if (!IN_SET(r, IPPROTO_UDPLITE, IPPROTO_SCTP)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Socket protocol not supported, ignoring: %s", rvalue); @@ -495,8 +495,7 @@ int config_parse_exec_nice( if (r == -ERANGE) log_syntax(unit, LOG_ERR, filename, line, r, "Nice priority out of range, ignoring: %s", rvalue); else - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse nice priority, ignoring: %s", rvalue); - + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse nice priority '%s', ignoring: %m", rvalue); return 0; } @@ -532,12 +531,11 @@ int config_parse_exec_oom_score_adjust( } r = parse_oom_score_adjust(rvalue, &oa); - if (r == -ERANGE) { - log_syntax(unit, LOG_ERR, filename, line, r, "OOM score adjust value out of range, ignoring: %s", rvalue); - return 0; - } if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse the OOM score adjust value, ignoring: %s", rvalue); + if (r == -ERANGE) + log_syntax(unit, LOG_ERR, filename, line, r, "OOM score adjust value out of range, ignoring: %s", rvalue); + else + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse the OOM score adjust value '%s', ignoring: %m", rvalue); return 0; } @@ -629,7 +627,7 @@ int config_parse_exec( r = unit_full_printf(u, f, &path); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve unit specifiers on %s%s: %m", + "Failed to resolve unit specifiers in '%s'%s: %m", f, ignore ? ", ignoring" : ""); return ignore ? 0 : -ENOEXEC; } @@ -637,7 +635,7 @@ int config_parse_exec( if (isempty(path)) { /* First word is either "-" or "@" with no command. */ log_syntax(unit, LOG_ERR, filename, line, 0, - "Empty path in command line%s: \"%s\"", + "Empty path in command line%s: '%s'", ignore ? ", ignoring" : "", rvalue); return ignore ? 0 : -ENOEXEC; } @@ -743,7 +741,7 @@ int config_parse_exec( r = unit_full_printf(u, word, &resolved); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve unit specifiers on %s%s: %m", + "Failed to resolve unit specifiers in %s%s: %m", word, ignore ? ", ignoring" : ""); return ignore ? 0 : -ENOEXEC; } @@ -797,26 +795,23 @@ int config_parse_socket_bindtodevice( void *userdata) { Socket *s = data; - char *n; assert(filename); assert(lvalue); assert(rvalue); assert(data); - if (rvalue[0] && !streq(rvalue, "*")) { - if (!ifname_valid(rvalue)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Interface name is invalid, ignoring: %s", rvalue); - return 0; - } + if (isempty(rvalue) || streq(rvalue, "*")) { + s->bind_to_device = mfree(s->bind_to_device); + return 0; + } - n = strdup(rvalue); - if (!n) - return log_oom(); - } else - n = NULL; + if (!ifname_valid(rvalue)) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid interface name, ignoring: %s", rvalue); + return 0; + } - free_and_replace(s->bind_to_device, n); + free_and_strdup(&s->bind_to_device, rvalue); return 0; } @@ -850,7 +845,7 @@ int config_parse_exec_input( r = unit_full_printf(u, n, &resolved); if (r < 0) - return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s: %m", n); + return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s': %m", n); if (isempty(resolved)) resolved = mfree(resolved); @@ -868,7 +863,7 @@ int config_parse_exec_input( r = unit_full_printf(u, n, &resolved); if (r < 0) - return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s: %m", n); + return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s': %m", n); if (!path_is_absolute(resolved)) { log_syntax(unit, LOG_ERR, filename, line, 0, "file: requires an absolute path name: %s", resolved); @@ -929,11 +924,11 @@ int config_parse_exec_input_text( r = cunescape(rvalue, 0, &unescaped); if (r < 0) - return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to decode C escaped text: %s", rvalue); + return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to decode C escaped text '%s': %m", rvalue); r = unit_full_printf(u, unescaped, &resolved); if (r < 0) - return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers: %s", unescaped); + return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s': %m", unescaped); sz = strlen(resolved); if (c->stdin_data_size + sz + 1 < c->stdin_data_size || /* check for overflow */ @@ -1037,7 +1032,7 @@ int config_parse_exec_output( if (n) { r = unit_full_printf(u, n, &resolved); if (r < 0) - return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s: %m", n); + return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s: %m", n); if (isempty(resolved)) resolved = mfree(resolved); @@ -1052,7 +1047,7 @@ int config_parse_exec_output( r = unit_full_printf(u, n, &resolved); if (r < 0) - return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s: %m", n); + return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s: %m", n); if (!path_is_absolute(resolved)) { log_syntax(unit, LOG_ERR, filename, line, 0, "file: requires an absolute path name: %s", resolved); @@ -1212,7 +1207,7 @@ int config_parse_exec_cpu_sched_prio(const char *unit, r = safe_atoi(rvalue, &i); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse CPU scheduling policy, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse CPU scheduling priority, ignoring: %s", rvalue); return 0; } @@ -1307,11 +1302,9 @@ int config_parse_exec_secure_bits(const char *unit, } r = secure_bits_from_string(rvalue); - if (r == -ENOMEM) - return log_oom(); if (r < 0) { log_syntax(unit, LOG_WARNING, filename, line, r, - "Invalid syntax, ignoring: %s", rvalue); + "Failed to parse secure bits, ignoring: %s", rvalue); return 0; } @@ -1352,10 +1345,8 @@ int config_parse_capability_set( /* else "AmbientCapabilities" initialized to all bits off */ r = capability_set_from_string(rvalue, &sum); - if (r == -ENOMEM) - return log_oom(); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse word: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse %s= specifier '%s', ignoring: %m", lvalue, rvalue); return 0; } @@ -1394,10 +1385,14 @@ int config_parse_sysv_priority(const char *unit, assert(data); r = safe_atoi(rvalue, &i); - if (r < 0 || i < 0) { + if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse SysV start priority, ignoring: %s", rvalue); return 0; } + if (i < 0) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid SysV start priority, ignoring: %s", rvalue); + return 0; + } *priority = (int) i; return 0; @@ -1429,7 +1424,7 @@ int config_parse_exec_mount_flags( r = mount_propagation_flags_from_string(rvalue, &c->mount_flags); if (r < 0) - log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse mount flag %s, ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse mount flag %s, ignoring: %m", rvalue); return 0; } @@ -1472,13 +1467,12 @@ int config_parse_exec_selinux_context( r = unit_full_printf(u, rvalue, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve specifiers%s: %m", - ignore ? ", ignoring" : ""); + "Failed to resolve unit specifiers in '%s'%s: %m", + rvalue, ignore ? ", ignoring" : ""); return ignore ? 0 : -ENOEXEC; } - free(c->selinux_context); - c->selinux_context = k; + free_and_replace(c->selinux_context, k); c->selinux_context_ignore = ignore; return 0; @@ -1522,13 +1516,12 @@ int config_parse_exec_apparmor_profile( r = unit_full_printf(u, rvalue, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve specifiers%s: %m", - ignore ? ", ignoring" : ""); + "Failed to resolve unit specifiers in '%s'%s: %m", + rvalue, ignore ? ", ignoring" : ""); return ignore ? 0 : -ENOEXEC; } - free(c->apparmor_profile); - c->apparmor_profile = k; + free_and_replace(c->apparmor_profile, k); c->apparmor_profile_ignore = ignore; return 0; @@ -1572,13 +1565,12 @@ int config_parse_exec_smack_process_label( r = unit_full_printf(u, rvalue, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve specifiers%s: %m", - ignore ? ", ignoring" : ""); + "Failed to resolve unit specifiers in '%s'%s: %m", + rvalue, ignore ? ", ignoring" : ""); return ignore ? 0 : -ENOEXEC; } - free(c->smack_process_label); - c->smack_process_label = k; + free_and_replace(c->smack_process_label, k); c->smack_process_label_ignore = ignore; return 0; @@ -1623,7 +1615,7 @@ int config_parse_timer(const char *unit, r = unit_full_printf(u, rvalue, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } @@ -1632,12 +1624,11 @@ int config_parse_timer(const char *unit, log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse calendar specification, ignoring: %s", k); return 0; } - } else { + } else if (parse_sec(k, &usec) < 0) { log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse timer value, ignoring: %s", k); return 0; } - } v = new0(TimerValue, 1); if (!v) @@ -1681,7 +1672,7 @@ int config_parse_trigger_unit( r = unit_name_printf(u, rvalue, &p); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %m"); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue); return 0; } @@ -1740,10 +1731,12 @@ int config_parse_path_spec(const char *unit, r = unit_full_printf(UNIT(p), rvalue, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue); return 0; } + path_kill_slashes(k); + if (!path_is_absolute(k)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Path is not absolute, ignoring: %s", k); return 0; @@ -1754,8 +1747,7 @@ int config_parse_path_spec(const char *unit, return log_oom(); s->unit = UNIT(p); - s->path = path_kill_slashes(k); - k = NULL; + s->path = TAKE_PTR(k); s->type = b; s->inotify_fd = -1; @@ -1789,7 +1781,7 @@ int config_parse_socket_service( r = unit_name_printf(UNIT(s), rvalue, &p); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s: %m", rvalue); return -ENOEXEC; } @@ -1837,7 +1829,7 @@ int config_parse_fdname( r = unit_full_printf(UNIT(s), rvalue, &p); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } @@ -1886,7 +1878,7 @@ int config_parse_service_sockets( r = unit_name_printf(UNIT(s), word, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %m"); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", word); continue; } @@ -1930,12 +1922,12 @@ int config_parse_bus_name( r = unit_full_printf(u, rvalue, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue); return 0; } if (!service_name_is_valid(k)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid bus name %s, ignoring.", k); + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid bus name, ignoring: %s", k); return 0; } @@ -2033,7 +2025,8 @@ int config_parse_user_group( void *data, void *userdata) { - char **user = data, *n; + _cleanup_free_ char *k = NULL; + char **user = data; Unit *u = userdata; int r; @@ -2042,29 +2035,23 @@ int config_parse_user_group( assert(rvalue); assert(u); - if (isempty(rvalue)) - n = NULL; - else { - _cleanup_free_ char *k = NULL; - - r = unit_full_printf(u, rvalue, &k); - if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s: %m", rvalue); - return -ENOEXEC; - } - - if (!valid_user_group_name_or_id(k)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid user/group name or numeric ID: %s", k); - return -ENOEXEC; - } - - n = TAKE_PTR(k); + if (isempty(rvalue)) { + *user = mfree(*user); + return 0; } - free(*user); - *user = n; + r = unit_full_printf(u, rvalue, &k); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s: %m", rvalue); + return -ENOEXEC; + } - return 0; + if (!valid_user_group_name_or_id(k)) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid user/group name or numeric ID: %s", k); + return -ENOEXEC; + } + + return free_and_replace(*user, k); } int config_parse_user_group_strv( @@ -2081,7 +2068,7 @@ int config_parse_user_group_strv( char ***users = data; Unit *u = userdata; - const char *p; + const char *p = rvalue; int r; assert(filename); @@ -2094,7 +2081,6 @@ int config_parse_user_group_strv( return 0; } - p = rvalue; for (;;) { _cleanup_free_ char *word = NULL, *k = NULL; @@ -2223,7 +2209,7 @@ int config_parse_unit_env_file(const char *unit, r = unit_full_printf(u, rvalue, &n); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } @@ -2285,7 +2271,7 @@ int config_parse_environ( r = unit_full_printf(u, word, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve specifiers, ignoring: %s", word); + "Failed to resolve unit specifiers in %s, ignoring: %m", word); continue; } } else @@ -2317,10 +2303,10 @@ int config_parse_pass_environ( void *data, void *userdata) { - const char *whole_rvalue = rvalue; _cleanup_strv_free_ char **n = NULL; size_t nlen = 0, nbufsize = 0; char*** passenv = data; + const char *p = rvalue; Unit *u = userdata; int r; @@ -2338,14 +2324,14 @@ int config_parse_pass_environ( for (;;) { _cleanup_free_ char *word = NULL, *k = NULL; - r = extract_first_word(&rvalue, &word, NULL, EXTRACT_QUOTES); + r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES); if (r == 0) break; if (r == -ENOMEM) return log_oom(); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Trailing garbage in %s, ignoring: %s", lvalue, whole_rvalue); + "Trailing garbage in %s, ignoring: %s", lvalue, rvalue); break; } @@ -2353,7 +2339,7 @@ int config_parse_pass_environ( r = unit_full_printf(u, word, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve specifiers, ignoring: %s", word); + "Failed to resolve specifiers in %s, ignoring: %m", word); continue; } } else @@ -2394,9 +2380,9 @@ int config_parse_unset_environ( void *userdata) { _cleanup_strv_free_ char **n = NULL; - const char *whole_rvalue = rvalue; size_t nlen = 0, nbufsize = 0; char*** unsetenv = data; + const char *p = rvalue; Unit *u = userdata; int r; @@ -2414,14 +2400,14 @@ int config_parse_unset_environ( for (;;) { _cleanup_free_ char *word = NULL, *k = NULL; - r = extract_first_word(&rvalue, &word, NULL, EXTRACT_CUNESCAPE|EXTRACT_QUOTES); + r = extract_first_word(&p, &word, NULL, EXTRACT_CUNESCAPE|EXTRACT_QUOTES); if (r == 0) break; if (r == -ENOMEM) return log_oom(); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Trailing garbage in %s, ignoring: %s", lvalue, whole_rvalue); + "Trailing garbage in %s, ignoring: %s", lvalue, rvalue); break; } @@ -2429,7 +2415,7 @@ int config_parse_unset_environ( r = unit_full_printf(u, word, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve specifiers, ignoring: %s", word); + "Failed to resolve unit specifiers in %s, ignoring: %m", word); continue; } } else @@ -2471,7 +2457,7 @@ int config_parse_log_extra_fields( ExecContext *c = data; Unit *u = userdata; - const char *p; + const char *p = rvalue; int r; assert(filename); @@ -2484,14 +2470,14 @@ int config_parse_log_extra_fields( return 0; } - for (p = rvalue;; ) { + for (;;) { _cleanup_free_ char *word = NULL, *k = NULL; struct iovec *t; const char *eq; r = extract_first_word(&p, &word, NULL, EXTRACT_CUNESCAPE|EXTRACT_QUOTES); if (r == 0) - break; + return 0; if (r == -ENOMEM) return log_oom(); if (r < 0) { @@ -2501,18 +2487,18 @@ int config_parse_log_extra_fields( r = unit_full_printf(u, word, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring field: %m", word); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", word); continue; } eq = strchr(k, '='); if (!eq) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Log field lacks '=' character, ignoring field: %s", k); + log_syntax(unit, LOG_ERR, filename, line, 0, "Log field lacks '=' character, ignoring: %s", k); continue; } if (!journal_field_valid(k, eq-k, false)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Log field name is invalid, ignoring field: %s", k); + log_syntax(unit, LOG_ERR, filename, line, 0, "Log field name is invalid, ignoring: %s", k); continue; } @@ -2525,8 +2511,6 @@ int config_parse_log_extra_fields( k = NULL; } - - return 0; } int config_parse_ip_tos(const char *unit, @@ -2597,7 +2581,7 @@ int config_parse_unit_condition_path( r = unit_full_printf(u, rvalue, &p); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue); return 0; } @@ -2654,7 +2638,7 @@ int config_parse_unit_condition_string( r = unit_full_printf(u, rvalue, &s); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue); return 0; } @@ -2733,8 +2717,8 @@ int config_parse_unit_requires_mounts_for( void *data, void *userdata) { + const char *p = rvalue; Unit *u = userdata; - const char *p; int r; assert(filename); @@ -2742,7 +2726,7 @@ int config_parse_unit_requires_mounts_for( assert(rvalue); assert(data); - for (p = rvalue;; ) { + for (;;) { _cleanup_free_ char *word = NULL, *resolved = NULL; r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES); @@ -2763,13 +2747,13 @@ int config_parse_unit_requires_mounts_for( r = unit_full_printf(u, word, &resolved); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit name \"%s\", ignoring: %m", word); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", word); continue; } r = unit_require_mounts_for(u, resolved, UNIT_DEPENDENCY_FILE); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to add required mount \"%s\", ignoring: %m", resolved); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to add required mount '%s', ignoring: %m", resolved); continue; } } @@ -2883,12 +2867,12 @@ int config_parse_syscall_filter( r = extract_first_word(&p, &word, NULL, 0); if (r == 0) - break; + return 0; if (r == -ENOMEM) return log_oom(); if (r < 0) { log_syntax(unit, LOG_WARNING, filename, line, r, "Invalid syntax, ignoring: %s", rvalue); - break; + return 0; } r = parse_syscall_and_errno(word, &name, &num); @@ -2903,8 +2887,6 @@ int config_parse_syscall_filter( if (r < 0) return r; } - - return 0; } int config_parse_syscall_archs( @@ -2919,8 +2901,8 @@ int config_parse_syscall_archs( void *data, void *userdata) { + const char *p = rvalue; Set **archs = data; - const char *p; int r; if (isempty(rvalue)) { @@ -2932,7 +2914,7 @@ int config_parse_syscall_archs( if (r < 0) return log_oom(); - for (p = rvalue;;) { + for (;;) { _cleanup_free_ char *word = NULL; uint32_t a; @@ -3052,9 +3034,9 @@ int config_parse_address_families( } af = af_from_name(word); - if (af <= 0) { + if (af <= 0) { log_syntax(unit, LOG_ERR, filename, line, 0, - "Failed to parse address family \"%s\", ignoring: %m", word); + "Failed to parse address family, ignoring: %s", word); continue; } @@ -3131,6 +3113,7 @@ int config_parse_unit_slice( void *data, void *userdata) { + _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_free_ char *k = NULL; Unit *u = userdata, *slice = NULL; int r; @@ -3142,19 +3125,19 @@ int config_parse_unit_slice( r = unit_name_printf(u, rvalue, &k); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue); return 0; } - r = manager_load_unit(u->manager, k, NULL, NULL, &slice); + r = manager_load_unit(u->manager, k, NULL, &error, &slice); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to load slice unit %s. Ignoring.", k); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to load slice unit %s, ignoring: %s", k, bus_error_message(&error, r)); return 0; } r = unit_set_slice(u, slice); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to assign slice %s to unit %s. Ignoring.", slice->id, u->id); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to assign slice %s to unit %s, ignoring: %m", slice->id, u->id); return 0; } @@ -3184,7 +3167,7 @@ int config_parse_cpu_weight( r = cg_weight_parse(rvalue, weight); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "CPU weight '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid CPU weight '%s', ignoring: %m", rvalue); return 0; } @@ -3212,7 +3195,7 @@ int config_parse_cpu_shares( r = cg_cpu_shares_parse(rvalue, shares); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "CPU shares '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid CPU shares '%s', ignoring: %m", rvalue); return 0; } @@ -3245,7 +3228,7 @@ int config_parse_cpu_quota( r = parse_percent_unbounded(rvalue); if (r <= 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "CPU quota '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid CPU quota '%s', ignoring.", rvalue); return 0; } @@ -3275,7 +3258,7 @@ int config_parse_memory_limit( if (r < 0) { r = parse_size(rvalue, 1024, &bytes); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Memory limit '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid memory limit '%s', ignoring: %m", rvalue); return 0; } } else @@ -3283,7 +3266,7 @@ int config_parse_memory_limit( if (bytes >= UINT64_MAX || (bytes <= 0 && !streq(lvalue, "MemorySwapMax"))) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Memory limit '%s' out of range. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, "Memory limit '%s' out of range, ignoring.", rvalue); return 0; } } @@ -3334,14 +3317,14 @@ int config_parse_tasks_max( if (r < 0) { r = safe_atou64(rvalue, &v); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Maximum tasks value '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid maximum tasks value '%s', ignoring: %m", rvalue); return 0; } } else v = system_tasks_max_scale(r, 100U); if (v <= 0 || v >= UINT64_MAX) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Maximum tasks value '%s' out of range. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, "Maximum tasks value '%s' out of range, ignoring.", rvalue); return 0; } @@ -3405,7 +3388,7 @@ int config_parse_delegate( cc = cgroup_controller_from_string(word); if (cc < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Invalid controller name '%s', ignoring", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid controller name '%s', ignoring", word); continue; } @@ -3438,11 +3421,10 @@ int config_parse_device_allow( void *data, void *userdata) { - _cleanup_free_ char *path = NULL, *t = NULL; + _cleanup_free_ char *path = NULL, *resolved = NULL; CGroupContext *c = data; CGroupDeviceAllow *a; - const char *m = NULL; - size_t n; + const char *p = rvalue; int r; if (isempty(rvalue)) { @@ -3452,32 +3434,35 @@ int config_parse_device_allow( return 0; } - r = unit_full_printf(userdata, rvalue, &t); + r = extract_first_word(&p, &path, NULL, EXTRACT_QUOTES); + if (r == -ENOMEM) + return log_oom(); if (r < 0) { log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to resolve specifiers in %s, ignoring: %m", - rvalue); + "Invalid syntax, ignoring: %s", rvalue); + return 0; + } + if (r == 0) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Failed to extract device path and rights from '%s', ignoring.", rvalue); return 0; } - n = strcspn(t, WHITESPACE); - - path = strndup(t, n); - if (!path) - return log_oom(); - - if (!is_deviceallow_pattern(path) && - !path_startswith(path, "/run/systemd/inaccessible/")) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s'. Ignoring.", path); + r = unit_full_printf(userdata, path, &resolved); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to resolve unit specifiers in '%s', ignoring: %m", path); return 0; } - m = t + n + strspn(t + n, WHITESPACE); - if (isempty(m)) - m = "rwm"; + if (!is_deviceallow_pattern(resolved) && + !path_startswith(resolved, "/run/systemd/inaccessible/")) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s', ignoring.", resolved); + return 0; + } - if (!in_charset(m, "rwm")) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device rights '%s'. Ignoring.", m); + if (!isempty(p) && !in_charset(p, "rwm")) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device rights '%s', ignoring.", p); return 0; } @@ -3485,10 +3470,10 @@ int config_parse_device_allow( if (!a) return log_oom(); - a->path = TAKE_PTR(path); - a->r = !!strchr(m, 'r'); - a->w = !!strchr(m, 'w'); - a->m = !!strchr(m, 'm'); + a->path = TAKE_PTR(resolved); + a->r = isempty(p) || !!strchr(p, 'r'); + a->w = isempty(p) || !!strchr(p, 'w'); + a->m = isempty(p) || !!strchr(p, 'm'); LIST_PREPEND(device_allow, c->device_allow, a); return 0; @@ -3515,7 +3500,7 @@ int config_parse_io_weight( r = cg_weight_parse(rvalue, weight); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "IO weight '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid IO weight '%s', ignoring.", rvalue); return 0; } @@ -3534,12 +3519,11 @@ int config_parse_io_device_weight( void *data, void *userdata) { - _cleanup_free_ char *path = NULL; + _cleanup_free_ char *path = NULL, *resolved = NULL; CGroupIODeviceWeight *w; CGroupContext *c = data; - const char *weight; + const char *p = rvalue; uint64_t u; - size_t n; int r; assert(filename); @@ -3553,28 +3537,36 @@ int config_parse_io_device_weight( return 0; } - n = strcspn(rvalue, WHITESPACE); - weight = rvalue + n; - weight += strspn(weight, WHITESPACE); - - if (isempty(weight)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Expected block device and device weight. Ignoring."); - return 0; - } - - path = strndup(rvalue, n); - if (!path) + r = extract_first_word(&p, &path, NULL, EXTRACT_QUOTES); + if (r == -ENOMEM) return log_oom(); - - if (!path_startswith(path, "/dev") && - !path_startswith(path, "/run/systemd/inaccessible/")) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s'. Ignoring.", path); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Invalid syntax, ignoring: %s", rvalue); + return 0; + } + if (r == 0 || isempty(p)) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Failed to extract device path and weight from '%s', ignoring.", rvalue); return 0; } - r = cg_weight_parse(weight, &u); + r = unit_full_printf(userdata, path, &resolved); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "IO weight '%s' invalid. Ignoring.", weight); + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to resolve unit specifiers in '%s', ignoring: %m", path); + return 0; + } + + if (!path_startswith(resolved, "/dev") && + !path_startswith(resolved, "/run/systemd/inaccessible/")) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s', ignoring.", resolved); + return 0; + } + + r = cg_weight_parse(p, &u); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "IO weight '%s' invalid, ignoring: %m", p); return 0; } @@ -3584,8 +3576,7 @@ int config_parse_io_device_weight( if (!w) return log_oom(); - w->path = TAKE_PTR(path); - + w->path = TAKE_PTR(resolved); w->weight = u; LIST_PREPEND(device_weights, c->io_device_weights, w); @@ -3604,13 +3595,12 @@ int config_parse_io_limit( void *data, void *userdata) { - _cleanup_free_ char *path = NULL; + _cleanup_free_ char *path = NULL, *resolved = NULL; CGroupIODeviceLimit *l = NULL, *t; CGroupContext *c = data; CGroupIOLimitType type; - const char *limit; + const char *p = rvalue; uint64_t num; - size_t n; int r; assert(filename); @@ -3626,37 +3616,45 @@ int config_parse_io_limit( return 0; } - n = strcspn(rvalue, WHITESPACE); - limit = rvalue + n; - limit += strspn(limit, WHITESPACE); - - if (!*limit) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Expected space separated pair of device node and bandwidth. Ignoring."); - return 0; - } - - path = strndup(rvalue, n); - if (!path) + r = extract_first_word(&p, &path, NULL, EXTRACT_QUOTES); + if (r == -ENOMEM) return log_oom(); - - if (!path_startswith(path, "/dev") && - !path_startswith(path, "/run/systemd/inaccessible/")) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s'. Ignoring.", path); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Invalid syntax, ignoring: %s", rvalue); + return 0; + } + if (r == 0 || isempty(p)) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Failed to extract device node and bandwidth from '%s', ignoring.", rvalue); return 0; } - if (streq("infinity", limit)) { + r = unit_full_printf(userdata, path, &resolved); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to resolve unit specifiers in '%s', ignoring: %m", path); + return 0; + } + + if (!path_startswith(resolved, "/dev") && + !path_startswith(resolved, "/run/systemd/inaccessible/")) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s', ignoring.", resolved); + return 0; + } + + if (streq("infinity", p)) { num = CGROUP_LIMIT_MAX; } else { - r = parse_size(limit, 1000, &num); + r = parse_size(p, 1000, &num); if (r < 0 || num <= 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "IO Limit '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid IO limit '%s', ignoring.", p); return 0; } } LIST_FOREACH(device_limits, t, c->io_device_limits) { - if (path_equal(path, t->path)) { + if (path_equal(resolved, t->path)) { l = t; break; } @@ -3669,7 +3667,7 @@ int config_parse_io_limit( if (!l) return log_oom(); - l->path = TAKE_PTR(path); + l->path = TAKE_PTR(resolved); for (ttype = 0; ttype < _CGROUP_IO_LIMIT_TYPE_MAX; ttype++) l->limits[ttype] = cgroup_io_limit_defaults[ttype]; @@ -3702,7 +3700,7 @@ int config_parse_blockio_weight( r = cg_blkio_weight_parse(rvalue, weight); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Block IO weight '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid block IO weight '%s', ignoring: %m", rvalue); return 0; } @@ -3721,12 +3719,11 @@ int config_parse_blockio_device_weight( void *data, void *userdata) { - _cleanup_free_ char *path = NULL; + _cleanup_free_ char *path = NULL, *resolved = NULL; CGroupBlockIODeviceWeight *w; CGroupContext *c = data; - const char *weight; + const char *p = rvalue; uint64_t u; - size_t n; int r; assert(filename); @@ -3740,28 +3737,36 @@ int config_parse_blockio_device_weight( return 0; } - n = strcspn(rvalue, WHITESPACE); - weight = rvalue + n; - weight += strspn(weight, WHITESPACE); - - if (isempty(weight)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Expected block device and device weight. Ignoring."); - return 0; - } - - path = strndup(rvalue, n); - if (!path) + r = extract_first_word(&p, &path, NULL, EXTRACT_QUOTES); + if (r == -ENOMEM) return log_oom(); - - if (!path_startswith(path, "/dev") && - !path_startswith(path, "/run/systemd/inaccessible/")) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s'. Ignoring.", path); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Invalid syntax, ignoring: %s", rvalue); + return 0; + } + if (r == 0 || isempty(p)) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Failed to extract device node and weight from '%s', ignoring.", rvalue); return 0; } - r = cg_blkio_weight_parse(weight, &u); + r = unit_full_printf(userdata, path, &resolved); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Block IO weight '%s' invalid. Ignoring.", weight); + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to resolve unit specifiers in '%s', ignoring: %m", path); + return 0; + } + + if (!path_startswith(resolved, "/dev") && + !path_startswith(resolved, "/run/systemd/inaccessible/")) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s'. Ignoring.", resolved); + return 0; + } + + r = cg_blkio_weight_parse(p, &u); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid block IO weight '%s', ignoring: %m", p); return 0; } @@ -3771,8 +3776,7 @@ int config_parse_blockio_device_weight( if (!w) return log_oom(); - w->path = TAKE_PTR(path); - + w->path = TAKE_PTR(resolved); w->weight = u; LIST_PREPEND(device_weights, c->blockio_device_weights, w); @@ -3791,13 +3795,12 @@ int config_parse_blockio_bandwidth( void *data, void *userdata) { - _cleanup_free_ char *path = NULL; + _cleanup_free_ char *path = NULL, *resolved = NULL; CGroupBlockIODeviceBandwidth *b = NULL, *t; CGroupContext *c = data; - const char *bandwidth; + const char *p = rvalue; uint64_t bytes; bool read; - size_t n; int r; assert(filename); @@ -3814,33 +3817,41 @@ int config_parse_blockio_bandwidth( return 0; } - n = strcspn(rvalue, WHITESPACE); - bandwidth = rvalue + n; - bandwidth += strspn(bandwidth, WHITESPACE); - - if (!*bandwidth) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Expected space separated pair of device node and bandwidth. Ignoring."); - return 0; - } - - path = strndup(rvalue, n); - if (!path) + r = extract_first_word(&p, &path, NULL, EXTRACT_QUOTES); + if (r == -ENOMEM) return log_oom(); - - if (!path_startswith(path, "/dev") && - !path_startswith(path, "/run/systemd/inaccessible/")) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s'. Ignoring.", path); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Invalid syntax, ignoring: %s", rvalue); + return 0; + } + if (r == 0 || isempty(p)) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Failed to extract device node and bandwidth from '%s', ignoring.", rvalue); return 0; } - r = parse_size(bandwidth, 1000, &bytes); + r = unit_full_printf(userdata, path, &resolved); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to resolve unit specifiers in '%s', ignoring: %m", path); + return 0; + } + + if (!path_startswith(resolved, "/dev") && + !path_startswith(resolved, "/run/systemd/inaccessible/")) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s', ignoring.", resolved); + return 0; + } + + r = parse_size(p, 1000, &bytes); if (r < 0 || bytes <= 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Block IO Bandwidth '%s' invalid. Ignoring.", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Invalid Block IO Bandwidth '%s', ignoring.", p); return 0; } LIST_FOREACH(device_bandwidths, t, c->blockio_device_bandwidths) { - if (path_equal(path, t->path)) { + if (path_equal(resolved, t->path)) { b = t; break; } @@ -3851,7 +3862,7 @@ int config_parse_blockio_bandwidth( if (!b) return log_oom(); - b->path = TAKE_PTR(path); + b->path = TAKE_PTR(resolved); b->rbps = CGROUP_LIMIT_MAX; b->wbps = CGROUP_LIMIT_MAX; @@ -3946,7 +3957,7 @@ int config_parse_exec_directories( r = unit_full_printf(u, word, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolve specifiers in \"%s\", ignoring: %m", word); + "Failed to resolve unit specifiers in \"%s\", ignoring: %m", word); continue; } @@ -4034,10 +4045,8 @@ int config_parse_set_status( return log_oom(); r = set_put(*set, INT_TO_PTR(val)); - if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Unable to store: %s", word); - return r; - } + if (r < 0) + return log_oom(); } if (!isempty(state)) log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring."); @@ -4059,7 +4068,7 @@ int config_parse_namespace_path_strv( Unit *u = userdata; char*** sv = data; - const char *cur; + const char *p = rvalue; int r; assert(filename); @@ -4073,13 +4082,12 @@ int config_parse_namespace_path_strv( return 0; } - cur = rvalue; for (;;) { _cleanup_free_ char *word = NULL, *resolved = NULL, *joined = NULL; const char *w; bool ignore_enoent = false, shall_prefix = false; - r = extract_first_word(&cur, &word, NULL, EXTRACT_QUOTES); + r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES); if (r == 0) break; if (r == -ENOMEM) @@ -4106,7 +4114,7 @@ int config_parse_namespace_path_strv( r = unit_full_printf(u, w, &resolved); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers in %s: %m", word); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s: %m", w); continue; } @@ -4145,7 +4153,7 @@ int config_parse_temporary_filesystems( Unit *u = userdata; ExecContext *c = data; - const char *cur; + const char *p = rvalue; int r; assert(filename); @@ -4161,14 +4169,13 @@ int config_parse_temporary_filesystems( return 0; } - cur = rvalue; for (;;) { _cleanup_free_ char *word = NULL, *path = NULL, *resolved = NULL; const char *w; - r = extract_first_word(&cur, &word, NULL, EXTRACT_QUOTES); + r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES); if (r == 0) - break; + return 0; if (r == -ENOMEM) return log_oom(); if (r < 0) { @@ -4178,14 +4185,20 @@ int config_parse_temporary_filesystems( w = word; r = extract_first_word(&w, &path, ":", EXTRACT_DONT_COALESCE_SEPARATORS); - if (r < 0) - return r; - if (r == 0) - return -EINVAL; + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract first word, ignoring: %s", word); + continue; + } + if (r == 0) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid syntax, ignoring: %s", word); + continue; + } r = unit_full_printf(u, path, &resolved); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers in %s, ignoring: %m", word); + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", path); continue; } @@ -4204,8 +4217,6 @@ int config_parse_temporary_filesystems( continue; } } - - return 0; } int config_parse_bind_paths( @@ -4258,7 +4269,7 @@ int config_parse_bind_paths( r = unit_full_printf(u, source, &sresolved); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to resolved specifiers in \"%s\", ignoring: %m", source); + "Failed to resolved unit specifiers in \"%s\", ignoring: %m", source); return 0; } @@ -4363,20 +4374,20 @@ int config_parse_no_new_privileges( void *userdata) { ExecContext *c = data; - int k; + int r; assert(filename); assert(lvalue); assert(rvalue); assert(data); - k = parse_boolean(rvalue); - if (k < 0) { - log_syntax(unit, LOG_ERR, filename, line, k, "Failed to parse boolean value, ignoring: %s", rvalue); + r = parse_boolean(rvalue); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse boolean value, ignoring: %s", rvalue); return 0; } - c->no_new_privileges = k; + c->no_new_privileges = r; return 0; } @@ -4435,9 +4446,6 @@ int config_parse_protect_system( assert(rvalue); assert(data); - /* Our enum shall be a superset of booleans, hence first try - * to parse as boolean, and then as enum */ - s = parse_protect_system_or_bool(rvalue); if (s < 0) { log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse protect system value, ignoring: %s", rvalue);