From 0796aaabfcaa46501e2512ae76557b986ad6e4f6 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 18 Mar 2025 22:00:29 -0400 Subject: [PATCH] libroot: Clean up fpurge implementation. * Take it from upstream glibc 2.15, much closer to the version we use. * Drop fpurge from stdio.h, it's nonstandard. Keep it around for ABI compatibility for now (BeOS didn't have it.) __fpurge is left in stdio_ext.h. --- headers/posix/stdio.h | 1 - .../libroot/posix/glibc/libio/__fpurge.c | 23 +++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/headers/posix/stdio.h b/headers/posix/stdio.h index 73a74a8768..e0d395d218 100644 --- a/headers/posix/stdio.h +++ b/headers/posix/stdio.h @@ -120,7 +120,6 @@ extern FILE *fopencookie(void *cookie, const char *mode, cookie_io_functions_t /* file I/O */ extern int fflush(FILE *stream); extern int fflush_unlocked(FILE *stream); -extern int fpurge(FILE *stream); extern int fgetpos(FILE *stream, fpos_t *position); extern int fsetpos(FILE *stream, const fpos_t *position); diff --git a/src/system/libroot/posix/glibc/libio/__fpurge.c b/src/system/libroot/posix/glibc/libio/__fpurge.c index 68217c8769..b167343561 100644 --- a/src/system/libroot/posix/glibc/libio/__fpurge.c +++ b/src/system/libroot/posix/glibc/libio/__fpurge.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -12,9 +12,11 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ +#include #include #include "libioP.h" @@ -25,7 +27,7 @@ __fpurge (FILE *fp) { /* Wide-char stream. */ if (_IO_in_backup (fp)) - _IO_free_wbackup_area (fp); + INTUSE(_IO_free_wbackup_area) (fp); fp->_wide_data->_IO_read_end = fp->_wide_data->_IO_read_ptr; fp->_wide_data->_IO_write_ptr = fp->_wide_data->_IO_write_base; @@ -34,16 +36,23 @@ __fpurge (FILE *fp) { /* Byte stream. */ if (_IO_in_backup (fp)) - _IO_free_backup_area (fp); + INTUSE(_IO_free_backup_area) (fp); fp->_IO_read_end = fp->_IO_read_ptr; fp->_IO_write_ptr = fp->_IO_write_base; } + + /* Avoid memory leak when there is an active ungetc buffer. */ + if (fp->_IO_save_base != NULL) + { + free (fp->_IO_save_base); + fp->_IO_save_base = NULL; + } } int fpurge(FILE* stream) { - __fpurge(stream); - return 0; + __fpurge(stream); + return 0; }