Date: Sun, 5 Jul 2009 18:28:56 +0200 From: Fabian Keil <freebsd-listen@fabiankeil.de> To: freebsd-hackers@freebsd.org Subject: Zero-length allocation with posix_memalign() Message-ID: <20090705182856.799b6b07@fabiankeil.de>
next in thread | raw e-mail | index | archive | help
--Sig_/Q1rwH7nD2rW98mS+oZ97tZs Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable 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 !=3D 0), function arena_malloc, file /usr/src/lib/l= ibc/stdlib/malloc.c, line 3349. R=E9mi 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=20 | picture should not be possible. posix_memalign() does support zero-length= =20 | allocation anyway: | http://www.opengroup.org/onlinepubs/9699919799/functions/posix_memalign.h= tml | | 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; =20 + if (size =3D=3D 0) { + if (opt_sysv =3D=3D false) + size =3D 1; + else { + ret =3D 0; + *memptr =3D result =3D NULL; + goto RETURN; + } + } if (malloc_init()) result =3D 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 --Sig_/Q1rwH7nD2rW98mS+oZ97tZs Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (FreeBSD) iEYEARECAAYFAkpQ1MwACgkQBYqIVf93VJ1G3wCgv+JfZxs0ptB4RcoqT7HT7YZ7 r7EAoJ2RofKSRVTIUYLArttbqHEI835p =djX3 -----END PGP SIGNATURE----- --Sig_/Q1rwH7nD2rW98mS+oZ97tZs--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090705182856.799b6b07>