[PATCH] acpica: fwts_acpica.c: Override ACPICA Semaphores to fix memory leak bug

Colin King colin.king at canonical.com
Wed May 16 09:03:48 UTC 2012


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

The ACPICA Semaphore deletion does not free the allocated semaphore so
we re-implement the creation and deletion for fwts to fix this ACPICA core
bug.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/acpica/Makefile.am   |    2 ++
 src/acpica/fwts_acpica.c |   47 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
index 5a475e9..7d1249c 100644
--- a/src/acpica/Makefile.am
+++ b/src/acpica/Makefile.am
@@ -20,6 +20,8 @@ osunixxf_munged.c: $(ACPICA_OSL)/osunixxf.c
 	sed 's/^AcpiOsReadPciConfiguration/__AcpiOsReadPciConfiguration/' | \
 	sed 's/^AcpiOsSignalSemaphore/__AcpiOsSignalSemaphore/' | \
 	sed 's/^AcpiOsWaitSemaphore/__AcpiOsWaitSemaphore/' | \
+	sed 's/^AcpiOsCreateSemaphore/__AcpiOsCreateSemaphore/' | \
+	sed 's/^AcpiOsDeleteSemaphore/__AcpiOsDeleteSemaphore/' | \
 	sed 's/^AcpiOsVprintf/__AcpiOsVprintf/' | \
 	sed 's/^AcpiOsSignal/__AcpiOsSignal/' | \
 	sed 's/^AcpiOsSleep/__AcpiOsSleep/' \
diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c
index 3dc5ced..b8119cb 100644
--- a/src/acpica/fwts_acpica.c
+++ b/src/acpica/fwts_acpica.c
@@ -485,6 +485,53 @@ void AcpiOsVprintf(const char *fmt, va_list args)
 }
 
 /*
+ *  AcpiOsCreateSemaphore()
+ *	Override ACPICA AcpiOsCreateSemaphore
+ */
+ACPI_STATUS AcpiOsCreateSemaphore(UINT32 MaxUnits,
+	UINT32 InitialUnits,
+	ACPI_HANDLE *OutHandle)
+{
+	sem_t *sem;
+
+	if (!OutHandle)
+		return AE_BAD_PARAMETER;
+
+	sem = AcpiOsAllocate(sizeof(sem_t));
+	if (!sem)
+		return AE_NO_MEMORY;
+
+	if (sem_init(sem, 0, InitialUnits) == -1) {
+		AcpiOsFree(sem);
+		return AE_BAD_PARAMETER;
+	}
+
+	*OutHandle = (ACPI_HANDLE)sem;
+
+	return AE_OK;
+}
+
+/*
+ *  AcpiOsDeleteSemaphore()
+ *	Override ACPICA AcpiOsDeleteSemaphore to fix semaphore memory freeing
+ */
+ACPI_STATUS AcpiOsDeleteSemaphore(ACPI_HANDLE Handle)
+{
+	sem_t *sem = (sem_t *)Handle;
+
+	if (!sem)
+		return AE_BAD_PARAMETER;
+
+	if (sem_destroy(sem) == -1)
+		return AE_BAD_PARAMETER;
+
+	AcpiOsFree(sem);
+
+	return AE_OK;
+}
+
+
+/*
  *  AcpiOsWaitSemaphore()
  *	Override ACPICA AcpiOsWaitSemaphore to keep track of semaphore acquires
  *	so that we can see if any methods are sloppy in their releases.
-- 
1.7.10





More information about the fwts-devel mailing list