Blame SOURCES/0063-hexdump.h-fix-arithmetic-error.patch

6e4e7f
From 9313a515432ba938e66f2edc1e22d548fed1eb5c Mon Sep 17 00:00:00 2001
6e4e7f
From: Peter Jones <pjones@redhat.com>
6e4e7f
Date: Thu, 30 Jul 2020 14:34:22 -0400
6e4e7f
Subject: [PATCH] hexdump.h: fix arithmetic error.
6e4e7f
6e4e7f
When I modified the hexdumper to help debug MokListRT mirroring not
6e4e7f
working because of PcdMaxVolatileVariableSize being tiny, I
6e4e7f
inadvertently added something that is effectively:
6e4e7f
6e4e7f
hexdump(..., char *buf, ..., int position)
6e4e7f
{
6e4e7f
	unsigned long begin = (position % 16);
6e4e7f
	unsigned long i;
6e4e7f
	...
6e4e7f
	for (i = 0; i < begin; i++) {
6e4e7f
		...
6e4e7f
	}
6e4e7f
	...
6e4e7f
}
6e4e7f
6e4e7f
Unfortunately, in c if 0x8 is set in position, that means begin is
6e4e7f
0xfffffffffffff8, because signed integer math is horrifying:
6e4e7f
6e4e7f
include/hexdump.h:99:vhexdumpf() &data[offset]:0x9E77E6BC size-offset:0x14
6e4e7f
include/hexdump.h:15:prepare_hex() position:0x9E77E6BC
6e4e7f
include/hexdump.h:17:prepare_hex() before:0xFFFFFFFFFFFFFFFC size:0x14
6e4e7f
include/hexdump.h:19:prepare_hex() before:0xFFFFFFFFFFFFFFFC after:0x0
6e4e7f
include/hexdump.h:21:prepare_hex() buf:0x000000009E77E2BC offset:0 &buf[offset]:0x000000009E77E2BC
6e4e7f
6e4e7f
Woops.
6e4e7f
6e4e7f
This could further have been prevented in /some/ cases by simply not
6e4e7f
preparing the hexdump buffer when "verbose" is disabled.
6e4e7f
6e4e7f
This patch makes "pos" be unsigned in all cases, and also checks for
6e4e7f
verbose in vhexdumpf() and simply returns if it is 0.
6e4e7f
6e4e7f
Signed-off-by: Peter Jones <pjones@redhat.com>
6e4e7f
---
6e4e7f
 include/hexdump.h | 7 +++++--
6e4e7f
 1 file changed, 5 insertions(+), 2 deletions(-)
6e4e7f
6e4e7f
diff --git a/include/hexdump.h b/include/hexdump.h
6e4e7f
index f3f3ac284a3..b2968cd4f85 100644
6e4e7f
--- a/include/hexdump.h
6e4e7f
+++ b/include/hexdump.h
6e4e7f
@@ -4,7 +4,7 @@
6e4e7f
 #include <stdint.h>
6e4e7f
 
6e4e7f
 static inline unsigned long UNUSED
6e4e7f
-prepare_hex(const void *data, size_t size, char *buf, int position)
6e4e7f
+prepare_hex(const void *data, size_t size, char *buf, unsigned int position)
6e4e7f
 {
6e4e7f
 	char hexchars[] = "0123456789abcdef";
6e4e7f
 	int offset = 0;
6e4e7f
@@ -48,7 +48,7 @@ prepare_hex(const void *data, size_t size, char *buf, int position)
6e4e7f
 #define isprint(c) ((c) >= 0x20 && (c) <= 0x7e)
6e4e7f
 
6e4e7f
 static inline void UNUSED
6e4e7f
-prepare_text(const void *data, size_t size, char *buf, int position)
6e4e7f
+prepare_text(const void *data, size_t size, char *buf, unsigned int position)
6e4e7f
 {
6e4e7f
 	int offset = 0;
6e4e7f
 	unsigned long i;
6e4e7f
@@ -84,6 +84,9 @@ vhexdumpf(const char *file, int line, const char *func, const CHAR16 * const fmt
6e4e7f
 	unsigned long display_offset = at;
6e4e7f
 	unsigned long offset = 0;
6e4e7f
 
6e4e7f
+	if (verbose == 0)
6e4e7f
+		return;
6e4e7f
+
6e4e7f
 	while (offset < size) {
6e4e7f
 		char hexbuf[49];
6e4e7f
 		char txtbuf[19];
6e4e7f
-- 
6e4e7f
2.26.2
6e4e7f