Blame SOURCES/0028-VLogError-Avoid-NULL-pointer-dereferences-in-V-Sprin.patch

6a35ff
From 344a8364cb05cdaafc43231d0f73d5217c4e118c Mon Sep 17 00:00:00 2001
12f6e9
From: Peter Jones <pjones@redhat.com>
12f6e9
Date: Tue, 12 Feb 2019 18:04:49 -0500
6a35ff
Subject: [PATCH 28/62] VLogError(): Avoid NULL pointer dereferences in
6a35ff
 (V)Sprint calls
6a35ff
6a35ff
VLogError() calculates the size of format strings by using calls to
6a35ff
SPrint and VSPrint with a StrSize of 0 and NULL for an output buffer.
6a35ff
Unfortunately, this is an incorrect usage of (V)Sprint. A StrSize
6a35ff
of "0" is special-cased to mean "there is no limit". So, we end up
6a35ff
writing our string to address 0x0. This was discovered because it
6a35ff
causes a crash on ARM where, unlike x86, it does not necessarily
6a35ff
have memory mapped at 0x0.
6a35ff
6a35ff
Avoid the (V)Sprint calls altogether by using (V)PoolPrint, which
6a35ff
handles the size calculation and allocation for us.
12f6e9
12f6e9
Signed-off-by: Peter Jones <pjones@redhat.com>
6a35ff
Fixes: 25f6fd08cd26 ("try to show errors more usefully.")
6a35ff
[dannf: commit message ]
6a35ff
Signed-off-by: dann frazier <dann.frazier@canonical.com>
6a35ff
Upstream-commit-id: 20e731f423a
12f6e9
---
12f6e9
 errlog.c | 15 +++------------
12f6e9
 1 file changed, 3 insertions(+), 12 deletions(-)
12f6e9
12f6e9
diff --git a/errlog.c b/errlog.c
12f6e9
index 18be4822d53..eebb266d396 100644
12f6e9
--- a/errlog.c
12f6e9
+++ b/errlog.c
12f6e9
@@ -14,29 +14,20 @@ EFI_STATUS
12f6e9
 VLogError(const char *file, int line, const char *func, CHAR16 *fmt, va_list args)
12f6e9
 {
12f6e9
 	va_list args2;
12f6e9
-	UINTN size = 0, size2;
12f6e9
 	CHAR16 **newerrs;
12f6e9
 
12f6e9
-	size = SPrint(NULL, 0, L"%a:%d %a() ", file, line, func);
12f6e9
-	va_copy(args2, args);
12f6e9
-	size2 = VSPrint(NULL, 0, fmt, args2);
12f6e9
-	va_end(args2);
12f6e9
-
12f6e9
 	newerrs = ReallocatePool(errs, (nerrs + 1) * sizeof(*errs),
12f6e9
 				       (nerrs + 3) * sizeof(*errs));
12f6e9
 	if (!newerrs)
12f6e9
 		return EFI_OUT_OF_RESOURCES;
12f6e9
 
12f6e9
-	newerrs[nerrs] = AllocatePool(size*2+2);
12f6e9
+	newerrs[nerrs] = PoolPrint(L"%a:%d %a() ", file, line, func);
12f6e9
 	if (!newerrs[nerrs])
12f6e9
 		return EFI_OUT_OF_RESOURCES;
12f6e9
-	newerrs[nerrs+1] = AllocatePool(size2*2+2);
12f6e9
+	va_copy(args2, args);
12f6e9
+	newerrs[nerrs+1] = VPoolPrint(fmt, args2);
12f6e9
 	if (!newerrs[nerrs+1])
12f6e9
 		return EFI_OUT_OF_RESOURCES;
12f6e9
-
12f6e9
-	SPrint(newerrs[nerrs], size*2+2, L"%a:%d %a() ", file, line, func);
12f6e9
-	va_copy(args2, args);
12f6e9
-	VSPrint(newerrs[nerrs+1], size2*2+2, fmt, args2);
12f6e9
 	va_end(args2);
12f6e9
 
12f6e9
 	nerrs += 2;
12f6e9
-- 
6a35ff
2.26.2
12f6e9