diff options
author | Florian Weimer <fweimer@redhat.com> | 2019-02-18 11:49:54 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-02-18 16:37:00 +0100 |
commit | a5406364ac949f91867352cb2ae867629f083c5b (patch) | |
tree | 0aeeedc3748d3b21cf8e8ea2e670670df1e441db /libio/libioP.h | |
parent | 6c29942cbf059aca47fd4bbd852ea42c9d46b71f (diff) | |
download | glibc-a5406364ac949f91867352cb2ae867629f083c5b.tar glibc-a5406364ac949f91867352cb2ae867629f083c5b.tar.gz glibc-a5406364ac949f91867352cb2ae867629f083c5b.tar.bz2 glibc-a5406364ac949f91867352cb2ae867629f083c5b.zip |
libio: Eliminate _IO_stdin, _IO_stdout, _IO_stderr
These variables are only used to determine if a stdio stream is
a pre-allocated stream, but it is possible to do so by comparing
a FILE * to all pre-allocated stream objects. As a result, it is
not necessary to keep those pointers in separate variables.
Behavior with symbol interposition is unchanged because _IO_stdin_,
_IO_stdout_, _IO_stderr_ are exported, and refer to objects outside of
libc if symbol interposition or copy relocations are involved. (The
removed variables _IO_stdin, _IO_stdout, _IO_stderr were not exported,
of course.)
Diffstat (limited to 'libio/libioP.h')
-rw-r--r-- | libio/libioP.h | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/libio/libioP.h b/libio/libioP.h index 8c75f15167..1c434ec3a1 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -817,7 +817,35 @@ extern int _IO_vscanf (const char *, va_list) __THROW; # endif #endif -extern struct _IO_fake_stdiobuf _IO_stdin_buf, _IO_stdout_buf, _IO_stderr_buf; +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) +/* See oldstdfiles.c. These are the old stream variables. */ +extern struct _IO_FILE_plus _IO_stdin_; +extern struct _IO_FILE_plus _IO_stdout_; +extern struct _IO_FILE_plus _IO_stderr_; + +static inline bool +_IO_legacy_file (FILE *fp) +{ + return fp == (FILE *) &_IO_stdin_ || fp == (FILE *) &_IO_stdout_ + || fp == (FILE *) &_IO_stderr_; +} +#endif + +/* Deallocate a stream if it is heap-allocated. Preallocated + stdin/stdout/stderr streams are not deallocated. */ +static inline void +_IO_deallocate_file (FILE *fp) +{ + /* The current stream variables. */ + if (fp == (FILE *) &_IO_2_1_stdin_ || fp == (FILE *) &_IO_2_1_stdout_ + || fp == (FILE *) &_IO_2_1_stderr_) + return; +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) + if (_IO_legacy_file (fp)) + return; +#endif + free (fp); +} #ifdef IO_DEBUG # define CHECK_FILE(FILE, RET) do { \ |