Created attachment 265666 [details] Shell session: trivial example + valgrind The manpage claims that: > The hdestroy() function calls free(3) for each comparison key in > the search table but not the data item associated with the key. This seems incorrect. The implementation frees the table but not the table items: https://cgit.freebsd.org/src/tree/lib/libc/stdlib/hdestroy_r.c See also attached proof. I think the problem is in the manpage because current implementation behaves correctly: - POSIX is not specific about it in the function description, but it provides an example where the caller holds ownership of the keys: https://pubs.opengroup.org/onlinepubs/9699919799/functions/hcreate.html - The GNU manpage hsearch(3) claims that: "The hdestroy() and hdestroy_r() functions do not free the buffers pointed to by the key and data elements of the hash table entries".
A commit in branch main references this bug: URL: https://cgit.FreeBSD.org/src/commit/?id=ab8ceaaa86baa077fcdc020a0c05ccf88fcd54d1 commit ab8ceaaa86baa077fcdc020a0c05ccf88fcd54d1 Author: Kit Dallege <xaum.io@gmail.com> AuthorDate: 2026-03-27 01:57:10 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2026-06-10 12:35:05 +0000 hcreate(3): fix incorrect claim that hdestroy frees keys The man page incorrectly stated that hdestroy() calls free(3) for each comparison key. The implementation (hdestroy_r.c) only frees the internal table structure, not the user-provided keys or data. This matches POSIX, which says hdestroy "shall dispose of the search table" without mentioning key deallocation. Update the description to clarify that the caller is responsible for freeing any memory associated with table entries. PR: 291240 Signed-off-by: Kit Dallege <xaum.io@gmail.com> Reviewed by: imp Pull Request: https://github.com/freebsd/freebsd-src/pull/2095 lib/libc/stdlib/hcreate.3 | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)