You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.6 KiB
50 lines
1.6 KiB
From cb99c3e54af1ba7c6cf1cd99d61546f5aa9423cb Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Mon, 2 Jul 2018 18:50:25 +0200
|
|
Subject: [PATCH] parse-util: in parse_permille() check negative earlier
|
|
|
|
If 'v' is negative, it's wrong to add the decimal to it, as we'd
|
|
actually need to subtract it in this case. But given that we don't want
|
|
to allow negative vaues anyway, simply check earlier whether what we
|
|
have parsed so far was negative, and react to that before adding the
|
|
decimal to it.
|
|
|
|
(cherry picked from commit 8cbc92d5975b603002c3141364a7709a9c66e23a)
|
|
|
|
Related: #2178179
|
|
---
|
|
src/basic/parse-util.c | 7 ++++---
|
|
1 file changed, 4 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c
|
|
index 992ea3605b..2ab8e88451 100644
|
|
--- a/src/basic/parse-util.c
|
|
+++ b/src/basic/parse-util.c
|
|
@@ -728,6 +728,8 @@ int parse_permille_unbounded(const char *p) {
|
|
r = safe_atoi(n, &v);
|
|
if (r < 0)
|
|
return r;
|
|
+ if (v < 0)
|
|
+ return -ERANGE;
|
|
} else {
|
|
pc = endswith(p, "%");
|
|
if (!pc)
|
|
@@ -748,15 +750,14 @@ int parse_permille_unbounded(const char *p) {
|
|
r = safe_atoi(n, &v);
|
|
if (r < 0)
|
|
return r;
|
|
+ if (v < 0)
|
|
+ return -ERANGE;
|
|
if (v > (INT_MAX - q) / 10)
|
|
return -ERANGE;
|
|
|
|
v = v * 10 + q;
|
|
}
|
|
|
|
- if (v < 0)
|
|
- return -ERANGE;
|
|
-
|
|
return v;
|
|
}
|
|
|