Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Jul 2009 17:56:00 +0000
From:      "Paul B. Mahol" <onemda@gmail.com>
To:        Fabian Keil <freebsd-listen@fabiankeil.de>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Zero-length allocation with posix_memalign()
Message-ID:  <3a142e750907051056n2e1424erfb6ed75b0bb94ed2@mail.gmail.com>
In-Reply-To: <20090705182856.799b6b07@fabiankeil.de>
References:  <20090705182856.799b6b07@fabiankeil.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On 7/5/09, Fabian Keil <freebsd-listen@fabiankeil.de> wrote:
> I recently submitted a patch to the vlc developers that prevents
> a crash on FreeBSD 8.0 by not calling posix_memalign() with a
> size argument of zero.
>
> A simplified test case would be:
>
> #include <stdlib.h>
> int main(int argc, char **argv) {
> 	void *ptr;
> 	posix_memalign(&ptr, 16, 0);
> 	return (0);
> }
>
> which triggers:
> Assertion failed: (size != 0), function arena_malloc, file
> /usr/src/lib/libc/stdlib/malloc.c, line 3349.

Actually that assertion is triggered only if MALLOC_PRODUCTION is undefined.
(when it is undefined it considerably slows thing down)
'a' flag for malloc.conf looks broken for me ....

>
> Remi Denis-Courmont, one of the vlc developers, pointed out
> that passing a zero size to posix_memalign() should actually
> work, though:
>
> | In principle, while useless, there is no reason why allocating an empty
> | picture should not be possible. posix_memalign() does support zero-length
> | allocation anyway:
> |
> http://www.opengroup.org/onlinepubs/9699919799/functions/posix_memalign.html
> | | If the size of the space requested is 0, the behavior is
> | | implementation-defined; the value returned in memptr shall be either a
> | | null pointer or a unique pointer.
> http://mailman.videolan.org/pipermail/vlc-devel/2009-July/062299.html
>
> I get the impression that this deviation from the standard could be
> easily fixed with something similar to the following, which is mostly
> copy and pasted from malloc():
>
> index 5404798..a078d07 100644
> --- a/malloc.c
> +++ b/malloc.c
> @@ -5303,6 +5303,15 @@ posix_memalign(void **memptr, size_t alignment,
> size_t size)
>  	int ret;
>  	void *result;
>
> +	if (size == 0) {
> +		if (opt_sysv == false)
> +			size = 1;
> +		else {
> +			ret = 0;
> +			*memptr = result = NULL;
> +			goto RETURN;
> +		}
> +	}
>  	if (malloc_init())
>  		result = NULL;
>  	else {
>
> I assume the "goto RETURN" isn't entirely compliant either as
> it skips the alignment check, but so does the malloc_init()
> failure branch.
>
> Fabian
>


-- 
Paul



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3a142e750907051056n2e1424erfb6ed75b0bb94ed2>