mirror of
git://sourceware.org/git/glibc.git
synced 2026-09-08 23:58:31 +08:00
This patch fixes a memory leak when ungetwc is used on a wide oriented stream. The backup buffer was never freed on fclose, causing a memory leak per ungetwc/fclose call. The leak has two causes: In iofclose.c, for wide streams (fp->mode > 0), _IO_new_fclose never calls _IO_free_wbackup_area. Fixed by adding the missing call. In wgenops.c, _IO_wdefault_finish checks fp->_IO_save_base (the narrow field, always NULL for wide streams) instead of fp->_wide_data->_IO_save_base, and uses a bare free() that leaves _IO_save_end and _IO_backup_base dangling. Replace the hand-rolled cleanup with _IO_have_wbackup/_IO_free_wbackup_area, which handles backup-mode switching and clears all three pointers. This was independently reported by Rocket Ma [1], whose patch corrects the condition but still uses the manual free path. Apply the same _IO_have_backup condition in genops.c for consistency. Tested by: make test t=libio/tst-wbackup-leak [1] https://patchwork.sourceware.org/project/glibc/patch/20260323171742.1039768-1-marocketbd@gmail.com/ Signed-off-by: Xiang Gao <gaoxiang@kylinos.cn>