uid-range: replace uid_range_contains() by more generalized uid_range_covers()

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.
This commit is contained in:
Lennart Poettering
2022-04-01 11:20:12 +02:00
parent 0a5c6a57c6
commit 556560495e
3 changed files with 31 additions and 5 deletions
+9 -4
View 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;
+5 -1
View 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);