]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
uid-range: replace uid_range_contains() by more generalized uid_range_covers()
authorLennart Poettering <lennart@poettering.net>
Thu, 31 Mar 2022 12:28:32 +0000 (14:28 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 1 Apr 2022 09:20:12 +0000 (11:20 +0200)
The former checks if one UID is inside the uid range set. The latter
checks if a full UID range is inside the uid range set. The former is
hence a special case of the latter.

src/shared/uid-range.c
src/shared/uid-range.h
src/test/test-uid-range.c

index 1fa7218ee679f5c978e9226e958b2c3dedf11539..1b4396a34cc70f396ed7077ded270651fff26f68 100644 (file)
@@ -179,12 +179,17 @@ int uid_range_next_lower(const UidRange *p, size_t n, uid_t *uid) {
         return 1;
 }
 
-bool uid_range_contains(const UidRange *p, size_t n, uid_t uid) {
-        assert(p);
-        assert(uid);
+bool uid_range_covers(const UidRange *p, size_t n, uid_t start, uid_t nr) {
+        assert(p || n == 0);
+
+        if (nr == 0) /* empty range? always covered... */
+                return true;
+
+        if (start > UINT32_MAX - nr) /* range overflows? definitely not covered... */
+                return false;
 
         for (size_t i = 0; i < n; i++)
-                if (uid >= p[i].start && uid < p[i].start + p[i].nr)
+                if (start >= p[i].start && start + nr <= p[i].start + p[i].nr)
                         return true;
 
         return false;
index d256a6eebba97e3c5ca523fb6e1ad89eb276e0f3..7259c9e371bf104fdde16391b37d61bf4da109e7 100644 (file)
@@ -12,6 +12,10 @@ int uid_range_add(UidRange **p, size_t *n, uid_t start, uid_t nr);
 int uid_range_add_str(UidRange **p, size_t *n, const char *s);
 
 int uid_range_next_lower(const UidRange *p, size_t n, uid_t *uid);
-bool uid_range_contains(const UidRange *p, size_t n, uid_t uid);
+bool uid_range_covers(const UidRange *p, size_t n, uid_t start, uid_t nr);
+
+static inline bool uid_range_contains(const UidRange *p, size_t n, uid_t uid) {
+        return uid_range_covers(p, n, uid, 1);
+}
 
 int uid_range_load_userns(UidRange **p, size_t *n, const char *path);
index 2e39628cefe998f5baedc6bb7fac4e8cb492a660..be8530bdd857a55626884c8e5e600aead4c39864 100644 (file)
@@ -19,6 +19,10 @@ TEST(uid_range) {
         size_t n = 0;
         uid_t search;
 
+        assert_se(uid_range_covers(p, n, 0, 0));
+        assert_se(!uid_range_covers(p, n, 0, 1));
+        assert_se(!uid_range_covers(p, n, 100, UINT32_MAX));
+
         assert_se(uid_range_add_str(&p, &n, "500-999") >= 0);
         assert_se(n == 1);
         assert_se(p[0].start == 500);
@@ -29,6 +33,17 @@ TEST(uid_range) {
         assert_se(uid_range_contains(p, n, 999));
         assert_se(!uid_range_contains(p, n, 1000));
 
+        assert_se(!uid_range_covers(p, n, 100, 150));
+        assert_se(!uid_range_covers(p, n, 400, 200));
+        assert_se(!uid_range_covers(p, n, 499, 1));
+        assert_se(uid_range_covers(p, n, 500, 1));
+        assert_se(uid_range_covers(p, n, 501, 10));
+        assert_se(uid_range_covers(p, n, 999, 1));
+        assert_se(!uid_range_covers(p, n, 999, 2));
+        assert_se(!uid_range_covers(p, n, 1000, 1));
+        assert_se(!uid_range_covers(p, n, 1000, 100));
+        assert_se(!uid_range_covers(p, n, 1001, 100));
+
         search = UID_INVALID;
         assert_se(uid_range_next_lower(p, n, &search));
         assert_se(search == 999);
@@ -97,6 +112,8 @@ TEST(load_userns) {
                 assert_se(n == 1);
                 assert_se(p[0].start == 0);
                 assert_se(p[0].nr == UINT32_MAX);
+
+                assert_se(uid_range_covers(p, n, 0, UINT32_MAX));
         }
 
         assert_se(fopen_temporary(NULL, &f, &fn) >= 0);