Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <3cx3oylv6hid2eunibcre7c5oqncuxkrk25x2plme2fqzmdpsf@sh7tmopzzgd5>
Date: Thu, 19 Jun 2025 15:57:47 +0200
From: Alejandro Colomar <alx@...nel.org>
To: linux-man@...r.kernel.org
Cc: musl@...ts.openwall.com, libc-alpha@...rceware.org, 
	Paul Eggert <eggert@...ucla.edu>, Bruno Haible <bruno@...sp.org>, bug-gnulib@....org
Subject: [v2] malloc.3: Clarify realloc(3) standards conformance

Hi,

Here's a revision of this change, addressing some concerns.  I'm only
showing the formatted changes, since the patch itself is unimportant.


Have a lovely day!
Alex

---
$ MANWIDTH=72 diffman-git HEAD
--- HEAD^:man/man3/malloc.3
+++ HEAD:man/man3/malloc.3
@@ -126,15 +126,32 @@
        │ realloc()                          │               │         │
        └────────────────────────────────────┴───────────────┴─────────┘
 
+VERSIONS
+       The behavior of realloc(p, 0) in glibc doesn’t conform to any of
+       C99, C11, POSIX.1‐2001, POSIX.1‐2008, POSIX.1‐2017, or
+       POSIX.1‐2024.  The C17 specification was changed to make it con‐
+       forming, but that specification was broken —it is impossible to
+       write code that works portably—, and C23 changed it again to
+       make this undefined behavior, acknowledging that the C17 speci‐
+       fication was broad enough that undefined behavior wasn’t worse
+       than that.
+
+       musl libc conforms to all versions of ISO C and POSIX.1.
+
+       gnulib provides the realloc‐posix module, which provides a wrap‐
+       per realloc() that conforms to POSIX.1‐2024.
+
+       reallocarray() suffers the same issues in glibc.
+
 STANDARDS
        malloc()
        free()
        calloc()
        realloc()
-              C11, POSIX.1‐2008.
+              C23, POSIX.1‐2024.
 
        reallocarray()
-              None.
+              POSIX.1‐2024.
 
 HISTORY
        malloc()
@@ -214,6 +231,22 @@
        POSIX and the C standard do not allow replacement of malloc(),
        free(), calloc(), and realloc().
 
+BUGS
+       Programmers would naturally expect that realloc(p, size) is con‐
+       sistent with free(p) and malloc(size).  This is not explicitly
+       required by POSIX.1‐2024 or C11, but all conforming implementa‐
+       tions are consistent with that.
+
+       The glibc implementation of realloc() is not consistent with
+       that, and as a consequence, it is dangerous to call
+       realloc(p, 0) in glibc.
+
+       A trivial workaround for glibc is calling it as
+       realloc(p, size?size:1).
+
+       The workaround for reallocarray() in glibc —which shares the
+       same bug— would be reallocarray(p, n?n:1, size?size:1).
+
 EXAMPLES
        #include <err.h>
        #include <stddef.h>

-- 
<https://www.alejandro-colomar.es/>

Download attachment "signature.asc" of type "application/pgp-signature" (834 bytes)

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.