From: Lennart Poettering Date: Mon, 1 Jun 2020 15:17:40 +0000 (+0200) Subject: parse-util: rewrite parse_uid_range() on top of parse_uid() X-Git-Tag: v246-rc1~202^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=60eb1f0728f215be85f0a65c1dca72a352833608;p=thirdparty%2Fsystemd.git parse-util: rewrite parse_uid_range() on top of parse_uid() parse_uid() does so many safety checks we want, hence rewrite parse_uid_range() on top of parse_uid() instead of parse_range(). --- diff --git a/src/basic/user-util.c b/src/basic/user-util.c index 4d087b1d3e3..7dd2f6664af 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;