42 lines
1.3 KiB
Diff
42 lines
1.3 KiB
Diff
From 604f8a6c4d58a646c8722fdf7cad9ee67479d8f7 Mon Sep 17 00:00:00 2001
|
||
From: Paul Eggert <eggert@cs.ucla.edu>
|
||
Date: Mon, 31 Jan 2022 10:20:21 -0800
|
||
Subject: [PATCH] dd: do not access uninitialized
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
* src/dd.c (parse_integer): Avoid undefined behavior
|
||
that accesses an uninitialized ‘n’ when e == LONGINT_INVALID.
|
||
Return more-accurate error code when INTMAX_MAX < n.
|
||
---
|
||
src/dd.c | 8 +++++---
|
||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||
|
||
diff --git a/src/dd.c b/src/dd.c
|
||
index e55f87f149..7360a49738 100644
|
||
--- a/src/dd.c
|
||
+++ b/src/dd.c
|
||
@@ -1427,8 +1427,10 @@ static intmax_t
|
||
parse_integer (char const *str, strtol_error *invalid)
|
||
{
|
||
/* Call xstrtoumax, not xstrtoimax, since we don't want to
|
||
- allow strings like " -0". */
|
||
- uintmax_t n;
|
||
+ allow strings like " -0". Initialize N to an interminate value;
|
||
+ calling code should not rely on this function returning 0
|
||
+ when *INVALID represents a non-overflow error. */
|
||
+ uintmax_t n = 0;
|
||
char *suffix;
|
||
strtol_error e = xstrtoumax (str, &suffix, 10, &n, "bcEGkKMPTwYZ0");
|
||
|
||
@@ -1468,7 +1470,7 @@ parse_integer (char const *str, strtol_error *invalid)
|
||
|
||
if (INTMAX_MAX < n)
|
||
{
|
||
- *invalid = LONGINT_OVERFLOW;
|
||
+ *invalid = e | LONGINT_OVERFLOW;
|
||
return INTMAX_MAX;
|
||
}
|
||
|