[PATCH] lib: fix assembly/disassembly segfault when AcpiOsVprintf is called (LP: #1195209)

Colin King colin.king at canonical.com
Thu Jun 27 10:25:58 UTC 2013


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

fwts --dis or fwts syntaxcheck can segfault if the ACPICA disassemble emits a
message via AcpiOsVprintf(). This calls the fwts_acpica helper function that
attempts to print to the log file which fails because the fw pointer is null.
This bug is a regression introduced with commit
54f1ef23a1c3bcbea023ddc799dc7d6becf60556.

To fix this, add a helper function to fwts_acpica that sets up the fwts
framework pointer so that fwts_acpica_vprintf won't segfault. Also sanity
check the framework pointer in fwts_acpica_vprintf in case it isn't set up
correctly.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/acpica/fwts_acpica.c      | 13 ++++++++++++-
 src/lib/include/fwts_acpica.h |  1 +
 src/lib/src/fwts_iasl.c       |  5 +++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c
index e396cd9..a0b551e 100644
--- a/src/acpica/fwts_acpica.c
+++ b/src/acpica/fwts_acpica.c
@@ -396,6 +396,9 @@ void fwts_acpica_vprintf(const char *fmt, va_list args)
 	char *tmp;
 	size_t tmp_len;
 
+	if (fwts_acpica_fw == NULL)
+		return;
+
 	/* Only emit messages if in ACPICA debug mode */
 	if (!(fwts_acpica_fw->flags & FWTS_FLAG_ACPICA_DEBUG))
 		return;
@@ -864,6 +867,14 @@ int fwtsInstallEarlyHandlers(fwts_framework *fw)
 	return FWTS_OK;
 }
 
+/*
+ *  fwts_acpcia_set_fwts_framework()
+ *	set fwts_acpica_fw ptr
+ */
+void fwts_acpcia_set_fwts_framework(fwts_framework *fw)
+{
+	fwts_acpica_fw = fw;
+}
 
 /*
  *  fwts_acpica_init()
@@ -883,7 +894,7 @@ int fwts_acpica_init(fwts_framework *fw)
 	pthread_mutex_init(&mutex_lock_sem_table, NULL);
 	pthread_mutex_init(&mutex_thread_info, NULL);
 
-	fwts_acpica_fw = fw;
+	fwts_acpcia_set_fwts_framework(fw);
 
 	AcpiDbgLevel = ACPI_NORMAL_DEFAULT;
 	AcpiDbgLayer = 0x00000000;
diff --git a/src/lib/include/fwts_acpica.h b/src/lib/include/fwts_acpica.h
index ab492e7..59bc6ef 100644
--- a/src/lib/include/fwts_acpica.h
+++ b/src/lib/include/fwts_acpica.h
@@ -24,6 +24,7 @@
 
 typedef void (*fwts_acpica_log_callback)(fwts_framework *fw, const char *buffer);
 
+void fwts_acpcia_set_fwts_framework(fwts_framework *fw);
 int  fwts_acpica_init(fwts_framework *fw);
 int  fwts_acpica_deinit(void);
 fwts_list *fwts_acpica_get_object_names(int type);
diff --git a/src/lib/src/fwts_iasl.c b/src/lib/src/fwts_iasl.c
index 6877c34..5058c1e 100644
--- a/src/lib/src/fwts_iasl.c
+++ b/src/lib/src/fwts_iasl.c
@@ -29,6 +29,7 @@
 
 #include "fwts.h"
 #include "fwts_iasl_interface.h"
+#include "fwts_acpica.h"
 
 /*
  *  fwts_iasl_dump_aml_to_file()
@@ -75,6 +76,8 @@ int fwts_iasl_disassemble_to_file(fwts_framework *fw,
 	int pid = getpid();
 	int ret;
 
+	fwts_acpcia_set_fwts_framework(fw);
+
 	if ((ret = fwts_acpi_find_table(fw, tablename, which, &table)) != FWTS_OK)
 		return ret;
 
@@ -179,6 +182,8 @@ int fwts_iasl_reassemble(fwts_framework *fw,
 	if ((iasl_disassembly  == NULL) || (iasl_errors == NULL))
 		return FWTS_ERROR;
 
+	fwts_acpcia_set_fwts_framework(fw);
+
 	*iasl_disassembly = NULL;
 
 	snprintf(tmpfile, sizeof(tmpfile), "/tmp/fwts_iasl_%d.dsl", pid);
-- 
1.8.3.1




More information about the fwts-devel mailing list