From 5bff40e719ba2eca0c8cb894930b8d4928c2c1f9 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 14 Mar 2023 10:38:58 +0100 Subject: [PATCH] uid-range: add uid_range_overlaps() helper --- src/basic/uid-range.c | 20 ++++++++++++++++++++ src/basic/uid-range.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/src/basic/uid-range.c b/src/basic/uid-range.c index 90eb0cd911..65504b899a 100644 --- a/src/basic/uid-range.c +++ b/src/basic/uid-range.c @@ -253,3 +253,23 @@ int uid_range_load_userns(UIDRange **ret, const char *path) { *ret = TAKE_PTR(range); return 0; } + +bool uid_range_overlaps(const UIDRange *range, uid_t start, uid_t nr) { + + if (!range) + return false; + + /* Avoid overflow */ + if (start > UINT32_MAX - nr) + nr = UINT32_MAX - start; + + if (nr == 0) + return false; + + FOREACH_ARRAY(entry, range->entries, range->n_entries) + if (start < entry->start + entry->nr && + start + nr >= entry->start) + return true; + + return false; +} diff --git a/src/basic/uid-range.h b/src/basic/uid-range.h index 5c4aac3726..acfb7191e9 100644 --- a/src/basic/uid-range.h +++ b/src/basic/uid-range.h @@ -34,3 +34,5 @@ static inline bool uid_range_contains(const UIDRange *range, uid_t uid) { int uid_map_read_one(FILE *f, uid_t *ret_base, uid_t *ret_shift, uid_t *ret_range); int uid_range_load_userns(UIDRange **ret, const char *path); + +bool uid_range_overlaps(const UIDRange *range, uid_t start, uid_t nr);