Philip Withnall 153fa8884b 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.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Fixes: #2325
2021-07-01 16:05:25 -05:00
..
2010-07-05 00:56:12 -04: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
2013-11-11 07:11:29 +01: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
2017-05-29 19:53:34 +02:00
2017-05-29 19:53:34 +02:00
2014-01-13 16:12:31 -05: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
2017-05-29 19:53:34 +02:00
2015-08-31 13:59:48 -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-10-16 09:39:24 -04:00
2012-10-16 09:39:24 -04:00
2017-05-29 19:53:34 +02: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