From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31060 invoked by alias); 2 Mar 2006 15:04:40 -0000 Received: (qmail 31041 invoked by uid 22791); 2 Mar 2006 15:04:39 -0000 X-Spam-Check-By: sourceware.org Received: from sunsite.ms.mff.cuni.cz (HELO sunsite.mff.cuni.cz) (195.113.15.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 02 Mar 2006 15:04:36 +0000 Received: from sunsite.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by sunsite.mff.cuni.cz (8.13.1/8.13.1) with ESMTP id k22F4Wf0012310; Thu, 2 Mar 2006 16:04:32 +0100 Received: (from jj@localhost) by sunsite.mff.cuni.cz (8.13.1/8.13.1/Submit) id k22F4UPI012309; Thu, 2 Mar 2006 16:04:30 +0100 Date: Thu, 02 Mar 2006 15:04:00 -0000 From: Jakub Jelinek To: Roland McGrath , Ulrich Drepper Cc: Wolfram Gloger , Glibc hackers Subject: Re: [PATCH] Make sure MALLOC_ALIGNMENT is at least long double's alignment Message-ID: <20060302150430.GO30252@sunsite.mff.cuni.cz> Reply-To: Jakub Jelinek References: <20060228152100.GH30252@sunsite.mff.cuni.cz> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20060228152100.GH30252@sunsite.mff.cuni.cz> User-Agent: Mutt/1.4.1i Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2006-03/txt/msg00017.txt.bz2 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 * 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