]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
parse-util: rewrite parse_uid_range() on top of parse_uid()
authorLennart Poettering <lennart@poettering.net>
Mon, 1 Jun 2020 15:17:40 +0000 (17:17 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 5 Jun 2020 13:56:32 +0000 (15:56 +0200)
parse_uid() does so many safety checks we want, hence rewrite
parse_uid_range() on top of parse_uid() instead of parse_range().

src/basic/user-util.c

index 4d087b1d3e3a9bdfd775f569e45693372971920f..7dd2f6664af6afee792110f95fd64e4ba77482b6 100644 (file)
@@ -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;