From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2138) id E8C853858024; Mon, 3 Jul 2023 08:03:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E8C853858024 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1688371430; bh=KDxvYjPU74G5D1lUjM7J5LWmMneLnG9XGonbXgBkUd8=; h=From:To:Subject:Date:From; b=JRtZAFoBS47cmkFtvpunzE+aKCNRxSAmjNZxDB5HSdPLn4kTUXAY1/ltFa+/VFWo8 VOBEVrn3pyNs5Tf/jDondU9dKgD/2/dASCRYJW7CBZHxtnX8ajP6B/g6Em1a5VjZNS fNe9bBpBv+P4GabBA6W1H491+lNoDnwwCI6pn1TY= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Andreas Schwab To: glibc-cvs@sourceware.org Subject: [glibc] Always do locking when accessing streams (bug 15142, bug 14697) X-Act-Checkin: glibc X-Git-Author: Andreas Schwab X-Git-Refname: refs/heads/master X-Git-Oldrev: 27cb2bb93d611d772621e801bf85c8b2b4c8b598 X-Git-Newrev: af130d27099651e0d27b2cf2cfb44dafd6fe8a26 Message-Id: <20230703080350.E8C853858024@sourceware.org> Date: Mon, 3 Jul 2023 08:03:50 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=af130d27099651e0d27b2cf2cfb44dafd6fe8a26 commit af130d27099651e0d27b2cf2cfb44dafd6fe8a26 Author: Andreas Schwab Date: Tue Jan 30 10:16:00 2018 +0100 Always do locking when accessing streams (bug 15142, bug 14697) Now that abort no longer calls fflush there is no reason to avoid locking the stdio streams anywhere. This fixes a conformance issue and potential heap corruption during exit. Diff: --- libio/genops.c | 43 ++++++++++--------------------------------- libio/libioP.h | 1 - 2 files changed, 10 insertions(+), 34 deletions(-) diff --git a/libio/genops.c b/libio/genops.c index 7131312704..fbd8dd9e75 100644 --- a/libio/genops.c +++ b/libio/genops.c @@ -682,7 +682,7 @@ _IO_adjust_column (unsigned start, const char *line, int count) libc_hidden_def (_IO_adjust_column) int -_IO_flush_all_lockp (int do_lock) +_IO_flush_all (void) { int result = 0; FILE *fp; @@ -695,8 +695,7 @@ _IO_flush_all_lockp (int do_lock) for (fp = (FILE *) _IO_list_all; fp != NULL; fp = fp->_chain) { run_fp = fp; - if (do_lock) - _IO_flockfile (fp); + _IO_flockfile (fp); if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base) || (_IO_vtable_offset (fp) == 0 @@ -706,8 +705,7 @@ _IO_flush_all_lockp (int do_lock) && _IO_OVERFLOW (fp, EOF) == EOF) result = EOF; - if (do_lock) - _IO_funlockfile (fp); + _IO_funlockfile (fp); run_fp = NULL; } @@ -718,14 +716,6 @@ _IO_flush_all_lockp (int do_lock) return result; } - - -int -_IO_flush_all (void) -{ - /* We want locking. */ - return _IO_flush_all_lockp (1); -} libc_hidden_def (_IO_flush_all) void @@ -791,6 +781,9 @@ _IO_unbuffer_all (void) { int legacy = 0; + run_fp = fp; + _IO_flockfile (fp); + #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) if (__glibc_unlikely (_IO_vtable_offset (fp) != 0)) legacy = 1; @@ -800,18 +793,6 @@ _IO_unbuffer_all (void) /* Iff stream is un-orientated, it wasn't used. */ && (legacy || fp->_mode != 0)) { -#ifdef _IO_MTSAFE_IO - int cnt; -#define MAXTRIES 2 - for (cnt = 0; cnt < MAXTRIES; ++cnt) - if (fp->_lock == NULL || _IO_lock_trylock (*fp->_lock) == 0) - break; - else - /* Give the other thread time to finish up its use of the - stream. */ - __sched_yield (); -#endif - if (! legacy && ! dealloc_buffers && !(fp->_flags & _IO_USER_BUF)) { fp->_flags |= _IO_USER_BUF; @@ -825,17 +806,15 @@ _IO_unbuffer_all (void) if (! legacy && fp->_mode > 0) _IO_wsetb (fp, NULL, NULL, 0); - -#ifdef _IO_MTSAFE_IO - if (cnt < MAXTRIES && fp->_lock != NULL) - _IO_lock_unlock (*fp->_lock); -#endif } /* Make sure that never again the wide char functions can be used. */ if (! legacy) fp->_mode = -1; + + _IO_funlockfile (fp); + run_fp = NULL; } #ifdef _IO_MTSAFE_IO @@ -861,9 +840,7 @@ __libio_freemem (void) int _IO_cleanup (void) { - /* We do *not* want locking. Some threads might use streams but - that is their problem, we flush them underneath them. */ - int result = _IO_flush_all_lockp (0); + int result = _IO_flush_all (); /* We currently don't have a reliable mechanism for making sure that C++ static destructors are executed in the correct order. diff --git a/libio/libioP.h b/libio/libioP.h index d777553cb0..745278e076 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -537,7 +537,6 @@ extern int _IO_new_do_write (FILE *, const char *, size_t); extern int _IO_old_do_write (FILE *, const char *, size_t); extern int _IO_wdo_write (FILE *, const wchar_t *, size_t); libc_hidden_proto (_IO_wdo_write) -extern int _IO_flush_all_lockp (int); extern int _IO_flush_all (void); libc_hidden_proto (_IO_flush_all) extern void _IO_flush_all_linebuffered (void);