diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index eacb0633499..36d86fb6cba 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -1506,22 +1506,22 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { r = extract_many_words(&p, NULL, EXTRACT_UNQUOTE, &action, &name, &id, &description, &home, &shell, NULL); if (r < 0) - return log_error_errno(r, "[%s:%u] Syntax error.", fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, r, "Syntax error."); if (r < 2) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Missing action and name columns.", fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Missing action and name columns."); if (!isempty(p)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Trailing garbage.", fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Trailing garbage."); /* Verify action */ if (strlen(action) != 1) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Unknown modifier '%s'", fname, line, action); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Unknown modifier '%s'.", action); if (!IN_SET(action[0], ADD_USER, ADD_GROUP, ADD_MEMBER, ADD_RANGE)) - return log_error_errno(SYNTHETIC_ERRNO(EBADMSG), - "[%s:%u] Unknown command type '%c'.", fname, line, action[0]); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EBADMSG), + "Unknown command type '%c'.", action[0]); /* Verify name */ if (empty_or_dash(name)) @@ -1530,12 +1530,11 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (name) { r = specifier_printf(name, NAME_MAX, system_and_tmp_specifier_table, arg_root, NULL, &resolved_name); if (r < 0) - return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m", fname, line, name); + return log_syntax(NULL, LOG_ERR, fname, line, r, "Failed to replace specifiers in '%s': %m", name); if (!valid_user_group_name(resolved_name, 0)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] '%s' is not a valid user or group name.", - fname, line, resolved_name); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "'%s' is not a valid user or group name.", resolved_name); } /* Verify id */ @@ -1545,8 +1544,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (id) { r = specifier_printf(id, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved_id); if (r < 0) - return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m", - fname, line, name); + return log_syntax(NULL, LOG_ERR, fname, line, r, + "Failed to replace specifiers in '%s': %m", name); } /* Verify description */ @@ -1556,13 +1555,12 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (description) { r = specifier_printf(description, LONG_LINE_MAX, system_and_tmp_specifier_table, arg_root, NULL, &resolved_description); if (r < 0) - return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m", - fname, line, description); + return log_syntax(NULL, LOG_ERR, fname, line, r, + "Failed to replace specifiers in '%s': %m", description); if (!valid_gecos(resolved_description)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] '%s' is not a valid GECOS field.", - fname, line, resolved_description); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "'%s' is not a valid GECOS field.", resolved_description); } /* Verify home */ @@ -1572,13 +1570,12 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (home) { r = specifier_printf(home, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved_home); if (r < 0) - return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m", - fname, line, home); + return log_syntax(NULL, LOG_ERR, fname, line, r, + "Failed to replace specifiers in '%s': %m", home); if (!valid_home(resolved_home)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] '%s' is not a valid home directory field.", - fname, line, resolved_home); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "'%s' is not a valid home directory field.", resolved_home); } /* Verify shell */ @@ -1588,63 +1585,57 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (shell) { r = specifier_printf(shell, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved_shell); if (r < 0) - return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m", - fname, line, shell); + return log_syntax(NULL, LOG_ERR, fname, line, r, + "Failed to replace specifiers in '%s': %m", shell); if (!valid_shell(resolved_shell)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] '%s' is not a valid login shell field.", - fname, line, resolved_shell); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "'%s' is not a valid login shell field.", resolved_shell); } switch (action[0]) { case ADD_RANGE: if (resolved_name) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type 'r' don't take a name field.", - fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type 'r' don't take a name field."); if (!resolved_id) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type 'r' require an ID range in the third field.", - fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type 'r' require an ID range in the third field."); if (description || home || shell) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type '%c' don't take a %s field.", - fname, line, action[0], - description ? "GECOS" : home ? "home directory" : "login shell"); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type '%c' don't take a %s field.", + action[0], + description ? "GECOS" : home ? "home directory" : "login shell"); r = uid_range_add_str(&uid_range, &n_uid_range, resolved_id); if (r < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Invalid UID range %s.", fname, line, resolved_id); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Invalid UID range %s.", resolved_id); return 0; case ADD_MEMBER: { /* Try to extend an existing member or group item */ if (!name) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type 'm' require a user name in the second field.", - fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type 'm' require a user name in the second field."); if (!resolved_id) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type 'm' require a group name in the third field.", - fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type 'm' require a group name in the third field."); if (!valid_user_group_name(resolved_id, 0)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] '%s' is not a valid user or group name.", - fname, line, resolved_id); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "'%s' is not a valid user or group name.", resolved_id); if (description || home || shell) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type '%c' don't take a %s field.", - fname, line, action[0], - description ? "GECOS" : home ? "home directory" : "login shell"); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type '%c' don't take a %s field.", + action[0], + description ? "GECOS" : home ? "home directory" : "login shell"); r = string_strv_ordered_hashmap_put(&members, resolved_id, resolved_name); if (r < 0) @@ -1655,9 +1646,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { case ADD_USER: if (!name) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type 'u' require a user name in the second field.", - fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type 'u' require a user name in the second field."); r = ordered_hashmap_ensure_allocated(&users, &item_hash_ops); if (r < 0) @@ -1679,7 +1669,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (valid_user_group_name(gid, 0)) i->group_name = TAKE_PTR(gid); else - return log_error_errno(r, "Failed to parse GID: '%s': %m", id); + return log_syntax(NULL, LOG_ERR, fname, line, r, + "Failed to parse GID: '%s': %m", id); } else { i->gid_set = true; i->id_set_strict = true; @@ -1689,7 +1680,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (!streq(resolved_id, "-")) { r = parse_uid(resolved_id, &i->uid); if (r < 0) - return log_error_errno(r, "Failed to parse UID: '%s': %m", id); + return log_syntax(NULL, LOG_ERR, fname, line, r, + "Failed to parse UID: '%s': %m", id); i->uid_set = true; } } @@ -1704,15 +1696,14 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { case ADD_GROUP: if (!name) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type 'g' require a user name in the second field.", - fname, line); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type 'g' require a user name in the second field."); if (description || home || shell) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "[%s:%u] Lines of type '%c' don't take a %s field.", - fname, line, action[0], - description ? "GECOS" : home ? "home directory" : "login shell"); + return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL), + "Lines of type '%c' don't take a %s field.", + action[0], + description ? "GECOS" : home ? "home directory" : "login shell"); r = ordered_hashmap_ensure_allocated(&groups, &item_hash_ops); if (r < 0) @@ -1729,7 +1720,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { } else { r = parse_gid(resolved_id, &i->gid); if (r < 0) - return log_error_errno(r, "Failed to parse GID: '%s': %m", id); + return log_syntax(NULL, LOG_ERR, fname, line, r, + "Failed to parse GID: '%s': %m", id); i->gid_set = true; } @@ -1749,9 +1741,9 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (existing) { /* Two identical items are fine */ if (!item_equal(existing, i)) - log_warning("%s:%u: conflict with earlier configuration for %s '%s', ignoring line.", - fname, line, - item_type_to_string(i->type), i->name); + log_syntax(NULL, LOG_WARNING, fname, line, SYNTHETIC_ERRNO(EUCLEAN), + "Conflict with earlier configuration for %s '%s', ignoring line.", + item_type_to_string(i->type), i->name); return 0; } diff --git a/test/test-sysusers.sh.in b/test/test-sysusers.sh.in index c9d9bd993b9..950dc297d8b 100755 --- a/test/test-sysusers.sh.in +++ b/test/test-sysusers.sh.in @@ -152,7 +152,7 @@ for f in $(ls -1 $SOURCE/unhappy-*.input | sort -V); do echo "*** Running test $f" prepare_testdir ${f%.input} cp $f $TESTDIR/usr/lib/sysusers.d/test.conf - $SYSUSERS --root=$TESTDIR 2>&1 | tail -n1 > $TESTDIR/err + $SYSUSERS --root=$TESTDIR 2>&1 | tail -n1 | sed -r 's/^[^:]+:[^:]+://' >$TESTDIR/err if ! diff -u $TESTDIR/err ${f%.*}.expected-err; then echo "**** Unexpected error output for $f" cat $TESTDIR/err diff --git a/test/test-sysusers/unhappy-1.expected-err b/test/test-sysusers/unhappy-1.expected-err index d3342402e98..f6b1b3c5e6f 100644 --- a/test/test-sysusers/unhappy-1.expected-err +++ b/test/test-sysusers/unhappy-1.expected-err @@ -1 +1 @@ -Failed to parse UID: '9999999999': Numerical result out of range + Failed to parse UID: '9999999999': Numerical result out of range