1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

Change offset in fdopen only if setting O_APPEND

fdopen should only be allowed to change the offset in the file it
attaches to if it is setting O_APPEND.  If O_APPEND is already set, it
should not change the state of the handle.
This commit is contained in:
Siddhesh Poyarekar
2014-03-17 18:42:53 +05:30
parent ea33158c96
commit ae42bbc55a
3 changed files with 71 additions and 4 deletions

View File

@ -59,6 +59,11 @@ _IO_new_fdopen (fd, mode)
int i;
int use_mmap = 0;
/* Decide whether we modify the offset of the file we attach to and seek to
the end of file. We only do this if the mode is 'a' and if the file
descriptor did not have O_APPEND in its flags already. */
bool do_seek = false;
switch (*mode)
{
case 'r':
@ -128,6 +133,7 @@ _IO_new_fdopen (fd, mode)
*/
if ((posix_mode & O_APPEND) && !(fd_flags & O_APPEND))
{
do_seek = true;
#ifdef F_SETFL
if (_IO_fcntl (fd, F_SETFL, fd_flags | O_APPEND) == -1)
#endif
@ -167,10 +173,11 @@ _IO_new_fdopen (fd, mode)
_IO_mask_flags (&new_f->fp.file, read_write,
_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
/* For append mode, set the file offset to the end of the file. Don't
update the offset cache though, since the file handle is not active. */
if ((read_write & (_IO_IS_APPENDING | _IO_NO_READS))
== (_IO_IS_APPENDING | _IO_NO_READS))
/* For append mode, set the file offset to the end of the file if we added
O_APPEND to the file descriptor flags. Don't update the offset cache
though, since the file handle is not active. */
if (do_seek && ((read_write & (_IO_IS_APPENDING | _IO_NO_READS))
== (_IO_IS_APPENDING | _IO_NO_READS)))
{
_IO_off64_t new_pos = _IO_SYSSEEK (&new_f->fp.file, 0, _IO_seek_end);
if (new_pos == _IO_pos_BAD && errno != ESPIPE)