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