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

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