diff options
author | Mikulas Patocka <[email protected]> | 2022-04-27 11:26:40 -0400 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2022-04-27 10:57:33 -0700 |
commit | e4d8a29997731b3bb14059024b24df9f784288d0 (patch) | |
tree | f00d3677b90779d9ff1a41bb401e8c9f40c69d1c | |
parent | e5be15767e7e284351853cbaba80cde8620341fb (diff) |
hex2bin: fix access beyond string end
If we pass too short string to "hex2bin" (and the string size without
the terminating NUL character is even), "hex2bin" reads one byte after
the terminating NUL character. This patch fixes it.
Note that hex_to_bin returns -1 on error and hex2bin return -EINVAL on
error - so we can't just return the variable "hi" or "lo" on error.
This inconsistency may be fixed in the next merge window, but for the
purpose of fixing this bug, we just preserve the existing behavior and
return -1 and -EINVAL.
Signed-off-by: Mikulas Patocka <[email protected]>
Reviewed-by: Andy Shevchenko <[email protected]>
Fixes: b78049831ffe ("lib: add error checking to hex2bin")
Cc: [email protected]
Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r-- | lib/hexdump.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/hexdump.c b/lib/hexdump.c index 369420ce553a..06833d404398 100644 --- a/lib/hexdump.c +++ b/lib/hexdump.c @@ -63,10 +63,13 @@ EXPORT_SYMBOL(hex_to_bin); int hex2bin(u8 *dst, const char *src, size_t count) { while (count--) { - int hi = hex_to_bin(*src++); - int lo = hex_to_bin(*src++); + int hi, lo; - if ((hi < 0) || (lo < 0)) + hi = hex_to_bin(*src++); + if (unlikely(hi < 0)) + return -EINVAL; + lo = hex_to_bin(*src++); + if (unlikely(lo < 0)) return -EINVAL; *dst++ = (hi << 4) | lo; |