mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
libio: Use stdin consistently for input functions [BZ #24153]
The internal _IO_stdin_ variable is not updated when the application assigns to stdin, which is a GNU extension.
This commit is contained in:
@@ -37,8 +37,8 @@ __gets_chk (char *buf, size_t size)
|
||||
if (size == 0)
|
||||
__chk_fail ();
|
||||
|
||||
_IO_acquire_lock (_IO_stdin);
|
||||
ch = _IO_getc_unlocked (_IO_stdin);
|
||||
_IO_acquire_lock (stdin);
|
||||
ch = _IO_getc_unlocked (stdin);
|
||||
if (ch == EOF)
|
||||
{
|
||||
retval = NULL;
|
||||
@@ -51,24 +51,24 @@ __gets_chk (char *buf, size_t size)
|
||||
/* This is very tricky since a file descriptor may be in the
|
||||
non-blocking mode. The error flag doesn't mean much in this
|
||||
case. We return an error only when there is a new error. */
|
||||
int old_error = _IO_stdin->_flags & _IO_ERR_SEEN;
|
||||
_IO_stdin->_flags &= ~_IO_ERR_SEEN;
|
||||
int old_error = stdin->_flags & _IO_ERR_SEEN;
|
||||
stdin->_flags &= ~_IO_ERR_SEEN;
|
||||
buf[0] = (char) ch;
|
||||
count = _IO_getline (_IO_stdin, buf + 1, size - 1, '\n', 0) + 1;
|
||||
if (_IO_stdin->_flags & _IO_ERR_SEEN)
|
||||
count = _IO_getline (stdin, buf + 1, size - 1, '\n', 0) + 1;
|
||||
if (stdin->_flags & _IO_ERR_SEEN)
|
||||
{
|
||||
retval = NULL;
|
||||
goto unlock_return;
|
||||
}
|
||||
else
|
||||
_IO_stdin->_flags |= old_error;
|
||||
stdin->_flags |= old_error;
|
||||
}
|
||||
if (count >= size)
|
||||
__chk_fail ();
|
||||
buf[count] = 0;
|
||||
retval = buf;
|
||||
unlock_return:
|
||||
_IO_release_lock (_IO_stdin);
|
||||
_IO_release_lock (stdin);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user