Zero-length allocation with posix_memalign()

Fabian Keil freebsd-listen at fabiankeil.de
Sun Jul 5 16:42:47 UTC 2009


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.

Rémi 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20090705/d3d61ab4/signature.pgp


More information about the freebsd-hackers mailing list