From: Jakub Jelinek <jakub@redhat.com>
To: Roland McGrath <roland@redhat.com>, Ulrich Drepper <drepper@redhat.com>
Cc: Wolfram Gloger <wg@malloc.de>,
Glibc hackers <libc-hacker@sources.redhat.com>
Subject: Re: [PATCH] Make sure MALLOC_ALIGNMENT is at least long double's alignment
Date: Thu, 02 Mar 2006 15:04:00 -0000 [thread overview]
Message-ID: <20060302150430.GO30252@sunsite.mff.cuni.cz> (raw)
In-Reply-To: <20060228152100.GH30252@sunsite.mff.cuni.cz>
Hi!
On Tue, Feb 28, 2006 at 04:21:00PM +0100, Jakub Jelinek wrote:
> The recent switch to 128-bit long double on ppc32 broke malloc,
> as on this 32-bit arch long double is 16 byte aligned, but malloc
> was only guaranteeing 8 byte aligment so far.
> On sparc32 and s390 this is not a problem, since __alignof__ (long double)
> is 8.
Here is an updated patch that results in no code changes unless
MALLOC_ALIGNMENT is bigger than the 2 * SIZE_SZ default (so only on ppc32):
2006-03-02 Jakub Jelinek <jakub@redhat.com>
* malloc/malloc.c (MALLOC_ALIGNMENT): Set to __alignof__ (long double)
if long double is more aligned than 2 * SIZE_SZ.
(misaligned_chunk): Define.
(public_rEALLOc, _int_free, _int_realloc): Use it.
--- libc/malloc/malloc.c.jj 2005-12-30 09:04:02.000000000 +0100
+++ libc/malloc/malloc.c 2006-03-02 10:52:38.000000000 +0100
@@ -188,7 +188,8 @@
Changing default word sizes:
INTERNAL_SIZE_T size_t
- MALLOC_ALIGNMENT 2 * sizeof(INTERNAL_SIZE_T)
+ MALLOC_ALIGNMENT MAX (2 * sizeof(INTERNAL_SIZE_T),
+ __alignof__ (long double))
Configuration and functionality options:
@@ -380,7 +381,8 @@ extern "C" {
#ifndef MALLOC_ALIGNMENT
-#define MALLOC_ALIGNMENT (2 * SIZE_SZ)
+#define MALLOC_ALIGNMENT (2 * SIZE_SZ < __alignof__ (long double) \
+ ? __alignof__ (long double) : 2 * SIZE_SZ)
#endif
/* The corresponding bit mask value */
@@ -1807,7 +1809,11 @@ nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-
/* Check if m has acceptable alignment */
-#define aligned_OK(m) (((unsigned long)((m)) & (MALLOC_ALIGN_MASK)) == 0)
+#define aligned_OK(m) (((unsigned long)(m) & MALLOC_ALIGN_MASK) == 0)
+
+#define misaligned_chunk(p) \
+ ((uintptr_t)(MALLOC_ALIGNMENT == 2 * SIZE_SZ ? (p) : chunk2mem (p)) \
+ & MALLOC_ALIGN_MASK)
/*
@@ -3468,7 +3474,7 @@ public_rEALLOc(Void_t* oldmem, size_t by
Therefore we can exclude some size values which might appear
here by accident or by "design" from some intruder. */
if (__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0)
- || __builtin_expect ((uintptr_t) oldp & MALLOC_ALIGN_MASK, 0))
+ || __builtin_expect (misaligned_chunk (oldp), 0))
{
malloc_printerr (check_action, "realloc(): invalid pointer", oldmem);
return NULL;
@@ -4282,7 +4288,7 @@ _int_free(mstate av, Void_t* mem)
Therefore we can exclude some size values which might appear
here by accident or by "design" from some intruder. */
if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
- || __builtin_expect ((uintptr_t) p & MALLOC_ALIGN_MASK, 0))
+ || __builtin_expect (misaligned_chunk (p), 0))
{
errstr = "free(): invalid pointer";
errout:
@@ -4628,7 +4634,7 @@ _int_realloc(mstate av, Void_t* oldmem,
oldsize = chunksize(oldp);
/* Simple tests for old block integrity. */
- if (__builtin_expect ((uintptr_t) oldp & MALLOC_ALIGN_MASK, 0))
+ if (__builtin_expect (misaligned_chunk (oldp), 0))
{
errstr = "realloc(): invalid pointer";
errout:
Jakub
next prev parent reply other threads:[~2006-03-02 15:04 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-02-28 15:21 Jakub Jelinek
2006-03-02 15:04 ` Jakub Jelinek [this message]
2006-03-02 15:53 ` Ulrich Drepper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060302150430.GO30252@sunsite.mff.cuni.cz \
--to=jakub@redhat.com \
--cc=drepper@redhat.com \
--cc=libc-hacker@sources.redhat.com \
--cc=roland@redhat.com \
--cc=wg@malloc.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).