]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
malloc: Correct malloc alignment on 32-bit architectures [BZ #6527]
authorFlorian Weimer <fweimer@redhat.com>
Tue, 24 May 2016 06:05:15 +0000 (08:05 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Tue, 24 May 2016 06:05:15 +0000 (08:05 +0200)
After the heap rewriting added in commit
4cf6c72fd2a482e7499c29162349810029632c3f (malloc: Rewrite dumped heap
for compatibility in __malloc_set_state), we can change malloc alignment
for new allocations because the alignment of old allocations no longer
matters.

We need to increase the malloc state version number, so that binaries
containing dumped heaps of the new layout will not try to run on
previous versions of glibc, resulting in obscure crashes.

This commit addresses a failure of tst-malloc-thread-fail on the
affected architectures (32-bit ppc and mips) because the test checks
pointer alignment.

ChangeLog
malloc/hooks.c
malloc/malloc.c

index 14822afacecb131da4710d4acbc5511dc6f54481..2b51267194c868297b7ddb67ce6a8f6c0625ad65 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2016-05-24  Florian Weimer  <fweimer@redhat.com>
+
+       [BZ #6527]
+       * malloc/malloc.c (MALLOC_ALIGNMENT): Use correct alignment
+       unconditionally.
+       * malloc/hooks.c (MALLOC_STATE_VERSION): Increase state version.
+
 2016-05-23  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
 
        * stdlib/tst-strtod6.c (do_test): Use new type generic
index 45241f217057119d80e2da9d98a53cc29d45598d..caa1e70d133f91ff8c18e8ac70aba149b12a55bd 100644 (file)
@@ -465,7 +465,7 @@ memalign_check (size_t alignment, size_t bytes, const void *caller)
    then the hooks are reset to 0.  */
 
 #define MALLOC_STATE_MAGIC   0x444c4541l
-#define MALLOC_STATE_VERSION (0 * 0x100l + 4l) /* major*0x100 + minor */
+#define MALLOC_STATE_VERSION (0 * 0x100l + 5l) /* major*0x100 + minor */
 
 struct malloc_save_state
 {
index 44524ff9847c9c15b09f0be1c98468c3d23110c5..ead9a21d81fb1442551b30ddc9e00deeead47922 100644 (file)
@@ -352,20 +352,8 @@ __malloc_assert (const char *assertion, const char *file, unsigned int line,
 
 
 #ifndef MALLOC_ALIGNMENT
-# if !SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_16)
-/* This is the correct definition when there is no past ABI to constrain it.
-
-   Among configurations with a past ABI constraint, it differs from
-   2*SIZE_SZ only on powerpc32.  For the time being, changing this is
-   causing more compatibility problems due to malloc_get_state and
-   malloc_set_state than will returning blocks not adequately aligned for
-   long double objects under -mlong-double-128.  */
-
-#  define MALLOC_ALIGNMENT       (2 *SIZE_SZ < __alignof__ (long double)      \
-                                  ? __alignof__ (long double) : 2 *SIZE_SZ)
-# else
-#  define MALLOC_ALIGNMENT       (2 *SIZE_SZ)
-# endif
+# define MALLOC_ALIGNMENT       (2 * SIZE_SZ < __alignof__ (long double) \
+                                ? __alignof__ (long double) : 2 * SIZE_SZ)
 #endif
 
 /* The corresponding bit mask value */