diff --git a/src/basic/user-util.c b/src/basic/user-util.c index 4d087b1d3e..7dd2f6664a 100644 --- a/src/basic/user-util.c +++ b/src/basic/user-util.c @@ -74,22 +74,39 @@ int parse_uid(const char *s, uid_t *ret) { } int parse_uid_range(const char *s, uid_t *ret_lower, uid_t *ret_upper) { - uint32_t u, l; + _cleanup_free_ char *word = NULL; + uid_t l, u; int r; assert(s); assert(ret_lower); assert(ret_upper); - r = parse_range(s, &l, &u); + r = extract_first_word(&s, &word, "-", EXTRACT_DONT_COALESCE_SEPARATORS); + if (r < 0) + return r; + if (r == 0) + return -EINVAL; + + r = parse_uid(word, &l); if (r < 0) return r; - if (l > u) + /* Check for the upper bound and extract it if needed */ + if (!s) + /* Single number with no dash. */ + u = l; + else if (!*s) + /* Trailing dash is an error. */ return -EINVAL; + else { + r = parse_uid(s, &u); + if (r < 0) + return r; - if (!uid_is_valid(l) || !uid_is_valid(u)) - return -ENXIO; + if (l > u) + return -EINVAL; + } *ret_lower = l; *ret_upper = u;