]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/parse-util: add helper to parse bounded unsigned values
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 16 Sep 2023 08:08:12 +0000 (10:08 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 19 Sep 2023 07:35:52 +0000 (09:35 +0200)
"parse_range" is already used for stuff like "a-b", so use "bounded" here to
avoid confusion.

src/basic/parse-util.c
src/basic/parse-util.h
src/test/test-parse-util.c

index b8fbe3f1c7718ec8dd91060e2205003fb7afb793..d39082ed15520e36e189824d8b40aa49dc8d643d 100644 (file)
@@ -425,6 +425,21 @@ int safe_atou_full(const char *s, unsigned base, unsigned *ret_u) {
         return 0;
 }
 
+int safe_atou_bounded(const char *s, unsigned min, unsigned max, unsigned *ret) {
+        unsigned v;
+        int r;
+
+        r = safe_atou(s, &v);
+        if (r < 0)
+                return r;
+
+        if (v < min || v > max)
+                return -ERANGE;
+
+        *ret = v;
+        return 0;
+}
+
 int safe_atoi(const char *s, int *ret_i) {
         unsigned base = 0;
         char *x = NULL;
index ca0252005ac87e4cb716ecfda130fb2143626106..e586077efb59afb1f0dea49dedc51a93e4ea67ff 100644 (file)
@@ -30,11 +30,12 @@ int parse_fd(const char *t);
 #define SAFE_ATO_MASK_FLAGS(base) ((base) & ~SAFE_ATO_ALL_FLAGS)
 
 int safe_atou_full(const char *s, unsigned base, unsigned *ret_u);
-
 static inline int safe_atou(const char *s, unsigned *ret_u) {
         return safe_atou_full(s, 0, ret_u);
 }
 
+int safe_atou_bounded(const char *s, unsigned min, unsigned max, unsigned *ret);
+
 int safe_atoi(const char *s, int *ret_i);
 int safe_atolli(const char *s, long long int *ret_i);
 
index 1ba8c8987fdfc5a39b2809bab669b4dafb7a54ee..7a485f390fb518c4c74cbf1aab95cab37197dbc8 100644 (file)
@@ -417,6 +417,32 @@ TEST(parse_range) {
         assert_se(upper == 9999);
 }
 
+TEST(safe_atou_bounded) {
+        int r;
+        unsigned x;
+
+        r = safe_atou_bounded("12345", 12, 20000, &x);
+        assert_se(r == 0);
+        assert_se(x == 12345);
+
+        r = safe_atou_bounded("12", 12, 20000, &x);
+        assert_se(r == 0);
+        assert_se(x == 12);
+
+        r = safe_atou_bounded("20000", 12, 20000, &x);
+        assert_se(r == 0);
+        assert_se(x == 20000);
+
+        r = safe_atou_bounded("-1", 12, 20000, &x);
+        assert_se(r == -ERANGE);
+
+        r = safe_atou_bounded("11", 12, 20000, &x);
+        assert_se(r == -ERANGE);
+
+        r = safe_atou_bounded("20001", 12, 20000, &x);
+        assert_se(r == -ERANGE);
+}
+
 TEST(safe_atolli) {
         int r;
         long long l;