Philip Withnall 87e19535fe 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-03-10 17:55:51 +00:00
..
2019-01-15 15:11:43 +00:00
2021-01-25 15:00:12 +01:00
2019-12-18 16:51:11 +00:00
2013-07-11 13:49:20 -04:00
2014-09-09 14:11:38 -04:00
2014-01-01 22:01:15 -05:00
2020-11-17 15:50:07 +00:00
2016-04-26 15:20:16 +02:00
2017-05-29 19:53:34 +02:00
2017-05-29 19:53:34 +02:00
2021-01-25 15:00:12 +01:00
2020-11-17 15:50:07 +00:00
2020-09-30 19:39:30 +01:00
2018-09-12 15:42:11 +00:00
2020-11-17 15:50:07 +00:00
2020-11-17 15:50:07 +00:00
2019-01-10 13:50:26 -05:00