[Bug 259294] [libc] add a freeres function

From: <bugzilla-noreply_at_freebsd.org>
Date: Sun, 05 Dec 2021 13:25:18 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=259294

--- Comment #2 from Paul Floyd <pjfloyd@wanadoo.fr> ---
With a debug build of libc, if I run a canonical C 'printf hello world' as
follows



LD_PRELOAD=/home/paulf/build/src/obj/usr/home/paulf/build/src/amd64.amd64/lib/libc/libc.so.7.full
/home/paulf/scratch/valgrind/vg-in-place --default-suppressions=no
--leak-check=yes --show-reachable=yes ./hello_world

then it tells me that the still reachable memory is

==89763== 4,096 bytes in 1 blocks are still reachable in loss record 1 of 1
==89763==    at 0x484C894: malloc (vg_replace_malloc.c:385)
==89763==    by 0x49716D2: __smakebuf (lib/libc/stdio/makebuf.c:73)
==89763==    by 0x4984164: __swsetup (lib/libc/stdio/wsetup.c:82)
==89763==    by 0x4977D82: __vfprintf (lib/libc/stdio/vfprintf.c:462)
==89763==    by 0x4977AF9: vfprintf_l (lib/libc/stdio/vfprintf.c:285)
==89763==    by 0x4972703: printf (lib/libc/stdio/printf.c:57)
==89763==    by 0x2018A8: main (hello_world.c:5)

Looking at the source, calls to printf pass through

#define prepwrite(fp) \
        ((((fp)->_flags & __SWR) == 0 || \
            ((fp)->_bf._base == NULL && ((fp)->_flags & __SSTR) == 0)) && \
         __swsetup(fp)


This checks that the buffer associated with stdout (also applies to stderr) is
allocated and if not allocates it.

I'll add a patch in a moment that seems to work, at least for stdout (should
work for stderr, not tested)

paulf>
LD_PRELOAD=/home/paulf/build/src/obj/usr/home/paulf/build/src/amd64.amd64/lib/libc/libc.so.7.full
/home/paulf/scratch/valgrind/vg-in-place --default-suppressions=no
--leak-check=yes --show-reachable=yes ./hello_world
==69502== Memcheck, a memory error detector
==69502== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==69502== Using Valgrind-3.19.0.GIT and LibVEX; rerun with -h for copyright
info
==69502== Command: ./hello_world
==69502== 
Hellw, World!
==69502== 
==69502== HEAP SUMMARY:
==69502==     in use at exit: 0 bytes in 0 blocks
==69502==   total heap usage: 1 allocs, 1 frees, 4,096 bytes allocated
==69502== 
==69502== All heap blocks were freed -- no leaks are possible
==69502== 
==69502== For lists of detected and suppressed errors, rerun with: -s
==69502== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

-- 
You are receiving this mail because:
You are the assignee for the bug.