[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Libunwind-devel] [PATCH 19/27] Fix memory leaks in unw_create_addr_spac
From: |
Tommi Rantala |
Subject: |
[Libunwind-devel] [PATCH 19/27] Fix memory leaks in unw_create_addr_space() wrong-endian error paths |
Date: |
Wed, 22 Aug 2012 14:28:45 +0300 |
Check the endianness earlier in unw_create_addr_space() on all
architectures to avoid leaking the dynamically allocated address space
struct.
This was already fixed for ARM in commit cf6a99879604 ("Fix memory leak
in ARM unw_create_addr_space()"). Move the endianness check also on ARM
to avoid malloc() & free() in the error case.
---
src/arm/Gcreate_addr_space.c | 20 +++++++++-----------
src/hppa/Gcreate_addr_space.c | 14 ++++++++------
src/mips/Gcreate_addr_space.c | 17 +++++++++--------
src/ppc/Gcreate_addr_space.c | 14 ++++++++------
src/x86/Gcreate_addr_space.c | 14 ++++++++------
src/x86_64/Gcreate_addr_space.c | 15 +++++++++------
6 files changed, 51 insertions(+), 43 deletions(-)
diff --git a/src/arm/Gcreate_addr_space.c b/src/arm/Gcreate_addr_space.c
index 5374649..4d59a20 100644
--- a/src/arm/Gcreate_addr_space.c
+++ b/src/arm/Gcreate_addr_space.c
@@ -32,8 +32,16 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
#ifdef UNW_LOCAL_ONLY
return NULL;
#else
- unw_addr_space_t as = malloc (sizeof (*as));
+ unw_addr_space_t as;
+ /*
+ * ARM supports little-endian and big-endian.
+ */
+ if (byte_order != 0 && byte_order != __LITTLE_ENDIAN
+ && byte_order != __BIG_ENDIAN)
+ return NULL;
+
+ as = malloc (sizeof (*as));
if (!as)
return NULL;
@@ -41,16 +49,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
as->acc = *a;
- /*
- * ARM supports little-endian and big-endian.
- */
- if (byte_order != 0 && byte_order != __LITTLE_ENDIAN
- && byte_order != __BIG_ENDIAN)
- {
- free(as);
- return NULL;
- }
-
/* Default to little-endian for ARM. */
if (byte_order == 0 || byte_order == __LITTLE_ENDIAN)
as->big_endian = 0;
diff --git a/src/hppa/Gcreate_addr_space.c b/src/hppa/Gcreate_addr_space.c
index 8f4301f..ecc805d 100644
--- a/src/hppa/Gcreate_addr_space.c
+++ b/src/hppa/Gcreate_addr_space.c
@@ -33,8 +33,15 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
#ifdef UNW_LOCAL_ONLY
return NULL;
#else
- unw_addr_space_t as = malloc (sizeof (*as));
+ unw_addr_space_t as;
+ /*
+ * hppa supports only big-endian.
+ */
+ if (byte_order != 0 && byte_order != __BIG_ENDIAN)
+ return NULL;
+
+ as = malloc (sizeof (*as));
if (!as)
return NULL;
@@ -42,11 +49,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
as->acc = *a;
- /*
- * hppa supports only big-endian.
- */
- if (byte_order != 0 && byte_order != __BIG_ENDIAN)
- return NULL;
return as;
#endif
}
diff --git a/src/mips/Gcreate_addr_space.c b/src/mips/Gcreate_addr_space.c
index af084ef..371841d 100644
--- a/src/mips/Gcreate_addr_space.c
+++ b/src/mips/Gcreate_addr_space.c
@@ -32,14 +32,7 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
#ifdef UNW_LOCAL_ONLY
return NULL;
#else
- unw_addr_space_t as = malloc (sizeof (*as));
-
- if (!as)
- return NULL;
-
- memset (as, 0, sizeof (*as));
-
- as->acc = *a;
+ unw_addr_space_t as;
/*
* MIPS supports only big or little-endian, not weird stuff like
@@ -50,6 +43,14 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
&& byte_order != __BIG_ENDIAN)
return NULL;
+ as = malloc (sizeof (*as));
+ if (!as)
+ return NULL;
+
+ memset (as, 0, sizeof (*as));
+
+ as->acc = *a;
+
if (byte_order == 0)
/* use host default: */
as->big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
diff --git a/src/ppc/Gcreate_addr_space.c b/src/ppc/Gcreate_addr_space.c
index 21ec10f..09bde56 100644
--- a/src/ppc/Gcreate_addr_space.c
+++ b/src/ppc/Gcreate_addr_space.c
@@ -35,8 +35,15 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
#ifdef UNW_LOCAL_ONLY
return NULL;
#else
- unw_addr_space_t as = malloc (sizeof (*as));
+ unw_addr_space_t as;
+ /*
+ * Linux ppc64 supports only big-endian.
+ */
+ if (byte_order != 0 && byte_order != __BIG_ENDIAN)
+ return NULL;
+
+ as = malloc (sizeof (*as));
if (!as)
return NULL;
@@ -44,11 +51,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
as->acc = *a;
- /*
- * Linux ppc64 supports only big-endian.
- */
- if (byte_order != 0 && byte_order != __BIG_ENDIAN)
- return NULL;
return as;
#endif
}
diff --git a/src/x86/Gcreate_addr_space.c b/src/x86/Gcreate_addr_space.c
index 5dd6367..5b07940 100644
--- a/src/x86/Gcreate_addr_space.c
+++ b/src/x86/Gcreate_addr_space.c
@@ -37,8 +37,15 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
#ifdef UNW_LOCAL_ONLY
return NULL;
#else
- unw_addr_space_t as = malloc (sizeof (*as));
+ unw_addr_space_t as;
+ /*
+ * x86 supports only little-endian.
+ */
+ if (byte_order != 0 && byte_order != __LITTLE_ENDIAN)
+ return NULL;
+
+ as = malloc (sizeof (*as));
if (!as)
return NULL;
@@ -46,11 +53,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
as->acc = *a;
- /*
- * x86 supports only little-endian.
- */
- if (byte_order != 0 && byte_order != __LITTLE_ENDIAN)
- return NULL;
return as;
#endif
}
diff --git a/src/x86_64/Gcreate_addr_space.c b/src/x86_64/Gcreate_addr_space.c
index 02b93eb..aab126a 100644
--- a/src/x86_64/Gcreate_addr_space.c
+++ b/src/x86_64/Gcreate_addr_space.c
@@ -3,6 +3,7 @@
Contributed by David Mosberger-Tang <address@hidden>
Modified for x86_64 by Max Asbock <address@hidden>
+ Copyright (C) 2012 Tommi Rantala <address@hidden>
This file is part of libunwind.
@@ -39,8 +40,15 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
#ifdef UNW_LOCAL_ONLY
return NULL;
#else
- unw_addr_space_t as = malloc (sizeof (*as));
+ unw_addr_space_t as;
+ /*
+ * x86_64 supports only little-endian.
+ */
+ if (byte_order != 0 && byte_order != __LITTLE_ENDIAN)
+ return NULL;
+
+ as = malloc (sizeof (*as));
if (!as)
return NULL;
@@ -48,11 +56,6 @@ unw_create_addr_space (unw_accessors_t *a, int byte_order)
as->acc = *a;
- /*
- * x86_64 supports only little-endian.
- */
- if (byte_order != 0 && byte_order != __LITTLE_ENDIAN)
- return NULL;
return as;
#endif
}
--
1.7.9.5
- [Libunwind-devel] [PATCH 08/27] Update .gitignore, (continued)
- [Libunwind-devel] [PATCH 08/27] Update .gitignore, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 11/27] MIPS: fix symbol naming for `mips_lock', `mips_local_resume', and `mips_local_addr_space_init', Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 15/27] MIPS: implement dwarf_to_unw_regnum() macro without table, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 13/27] Allow for architecture specific dwarf_to_unw_regnum(), Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 12/27] PPC: do not export dwarf_to_unw_regnum_map, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 10/27] Stop using nonportable echo arguments in tests, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 14/27] ARM: implement dwarf_to_unw_regnum() macro without table, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 17/27] Use constants for ELF magic bytes in _UCD_create.c, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 23/27] Avoid -Wunused-value warning in tests/Gtest-exc.c, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 18/27] Remove unneeded length modifier from suppressed match in sscanf() format in tests/crasher.c, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 19/27] Fix memory leaks in unw_create_addr_space() wrong-endian error paths,
Tommi Rantala <=
- [Libunwind-devel] [PATCH 16/27] Fix plain return from main() in tests/test-async-sig.c, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 22/27] test-resume-sig-rt: test unw_resume() in presence of "realtime" signal frame, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 25/27] Place `inline' at beginning of declaration of invalidate_edi(), Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 20/27] ARM: fix non-signal-frame local unw_resume() due to compiler optimization cleverness, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 21/27] ARM: fix with-signal-frame local unw_resume(), Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 24/27] Flush icache with __builtin___clear_cache() in tests when compiling with GCC, Tommi Rantala, 2012/08/22
- [Libunwind-devel] [PATCH 26/27] Fix function name duplication in Debug() output, Tommi Rantala, 2012/08/22