[PATCH 06/11] lib: fwts_acpi_tables: ensure we don't overflow a table name when given bad input

Colin King colin.king at canonical.com
Wed Apr 11 23:50:51 UTC 2012


From: Colin Ian King <colin.king at canonical.com>

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/lib/src/fwts_acpi_tables.c |   30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
index 0a90d37..f09e94c 100644
--- a/src/lib/src/fwts_acpi_tables.c
+++ b/src/lib/src/fwts_acpi_tables.c
@@ -19,6 +19,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stddef.h>
 #include <stdbool.h>
 #include <string.h>
 #include <unistd.h>
@@ -308,25 +309,40 @@ static uint8_t *fwts_acpi_load_table_from_acpidump(FILE *fp, char *name, uint64_
 {
 	uint32_t offset;
 	uint8_t  data[16];
-	char buffer[80];
+	char buffer[128];
 	uint8_t *table = NULL;
 	char *ptr = buffer;
 	size_t len = 0;
 	unsigned long long table_addr;
+	ptrdiff_t name_len;
 
 	*size = 0;
 
 	if (fgets(buffer, sizeof(buffer), fp) == NULL)
 		return NULL;
 
-	for (ptr = buffer; *ptr && *ptr != '@'; ptr++)
-		;
-
-	if ((*ptr != '@') || ((ptr - buffer) < 5))
-		return NULL; /* Bad name? */
+	/*
+	 * Parse tablename followed by address, e.g.
+	 *   DSTD @ 0xbfa02344 
+	 *   SSDT4 @ 0xbfa0f230 
+	 */
+	ptr = strstr(buffer, "@ 0x");
+	if (ptr == NULL)
+		return NULL; /* Can't find table name */
+
+	name_len = ptr - buffer;
+	/*
+	 * We should have no more than the table name (4..5 chars)
+	 * plus a space left between the start of the buffer and
+	 * the @ sign.  If we have more then something is wrong with
+	 * the data. So just ignore this garbage as we don't want to
+	 * overflow the name on the following strcpy()
+	 */
+	if ((name_len > 6) || (name_len < 5))
+		return NULL; /* Name way too long or too short */
 
 	if (sscanf(ptr, "@ 0x%Lx\n", &table_addr) < 1)
-		return NULL;
+		return NULL; /* Can't parse address */
 	
 	*(ptr-1) = '\0';
 	strcpy(name, buffer);
-- 
1.7.9.5





More information about the fwts-devel mailing list