1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +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

@@ -414,6 +414,61 @@ do_append_test (const char *filename)
}
}
/* For fdopen in 'a' mode, the file descriptor should not change if the file
is already open with the O_APPEND flag set. */
fd = open (filename, O_WRONLY | O_APPEND, 0);
if (fd == -1)
{
printf ("open(O_APPEND) failed: %m\n");
return 1;
}
off_t seek_ret = lseek (fd, file_len - 1, SEEK_SET);
if (seek_ret == -1)
{
printf ("lseek[O_APPEND][0] failed: %m\n");
ret |= 1;
}
fp = fdopen (fd, "a");
if (fp == NULL)
{
printf ("fdopen(O_APPEND) failed: %m\n");
close (fd);
return 1;
}
off_t new_seek_ret = lseek (fd, 0, SEEK_CUR);
if (seek_ret == -1)
{
printf ("lseek[O_APPEND][1] failed: %m\n");
ret |= 1;
}
printf ("\tappend: fdopen (file, \"a\"): O_APPEND: ");
if (seek_ret != new_seek_ret)
{
printf ("incorrectly modified file offset to %ld, should be %ld",
new_seek_ret, seek_ret);
ret |= 1;
}
else
printf ("retained current file offset %ld", seek_ret);
new_seek_ret = ftello (fp);
if (seek_ret != new_seek_ret)
{
printf (", ftello reported incorrect offset %ld, should be %ld\n",
new_seek_ret, seek_ret);
ret |= 1;
}
else
printf (", ftello reported correct offset %ld\n", seek_ret);
fclose (fp);
return ret;
}