Files
glib/gio/tests
Philip Withnall 4e64a27f4f glocalfileoutputstream: Fix CREATE_REPLACE_DESTINATION with symlinks
The `G_FILE_CREATE_REPLACE_DESTINATION` flag is equivalent to unlinking
the destination file and re-creating it from scratch. That did
previously work, but in the process the code would call `open(O_CREAT)`
on the file. If the file was a dangling symlink, this would create the
destination file (empty). That’s not an intended side-effect, and has
security implications if the symlink is controlled by a lower-privileged
process.

Fix that by not opening the destination file if it’s a symlink, and
adjusting the rest of the code to cope with
 - the fact that `fd == -1` is not an error iff `is_symlink` is true,
 - and that `original_stat` will contain the `lstat()` results for the
   symlink now, rather than the `stat()` results for its target (again,
   iff `is_symlink` is true).

This means that the target of the dangling symlink is no longer created,
which was the bug. The symlink itself continues to be replaced (as
before) with the new file — this is the intended behaviour of
`g_file_replace()`.

The behaviour for non-symlink cases, or cases where the symlink was not
dangling, should be unchanged.

Includes a unit test.

Resolves CVE-2021-28153 (glib#2325). Backported to GLib 2.58 by
Simon McVittie.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
(cherry-picked from commit 317b3b5870)
[Backport to 2.58.x: replace g_local_file_fstat with fstat]
[Backport to 2.58.x: replace g_local_file_lstat with lstat]
[Backport to 2.58.x: replace _g_stat_mode with direct access to st_mode]
[Backport to 2.58.x: don't call g_test_summary()]
Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-03-19 10:41:56 +00:00
..
2013-07-11 13:49:20 -04:00
2013-11-23 22:21:29 -05:00
2014-09-09 14:11:38 -04:00
2015-02-23 10:40:40 -05:00
2014-01-01 22:01:15 -05:00
2017-05-29 19:53:34 +02:00
2016-04-26 15:20:16 +02:00
2014-06-28 14:06:36 -04:00
2012-10-16 09:39:24 -04:00
2017-05-29 19:53:34 +02:00
2017-05-29 19:53:34 +02:00
2012-10-16 09:39:24 -04:00
2017-05-29 19:53:34 +02:00
2017-05-29 19:53:34 +02:00
2018-10-10 13:51:06 -04:00
2017-05-29 19:53:34 +02:00
2014-01-13 16:12:31 -05:00
2012-10-16 09:39:24 -04:00
2017-05-29 19:53:34 +02:00
2017-05-29 19:53:34 +02:00
2018-10-10 13:51:06 -04:00
2017-05-29 19:53:34 +02:00
2012-10-16 09:39:24 -04:00
2012-10-16 09:39:24 -04:00
2012-01-13 17:12:53 +01:00
2012-01-13 17:12:53 +01:00
2012-01-13 17:12:53 +01:00
2012-01-13 17:12:53 +01:00
2012-01-13 17:12:53 +01:00
2012-01-13 17:12:53 +01:00
2012-12-12 15:20:22 +01:00
2012-10-16 09:39:24 -04:00