Philip Withnall 149e5c5159 gfileutils: Correctly reset start value when canonicalising paths
If a path starts with more than two slashes, the `start` value was
previously incorrect:
 1. As per the `g_path_skip_root()` call, `start` was set to point to
    after the final initial slash. For a path with three initial
    slashes, this is the character after the third slash.
 2. The canonicalisation loop to find the first dir separator sets
    `output` to point to the character after the first slash (and it
    overwrites the first slash to be `G_DIR_SEPARATOR`).
 3. At this point, with a string `///usr`, `output` points to the second
    `/`; and `start` points to the `u`. This is incorrect, as `start`
    should point to the starting character for output, as per the
    original call to `g_path_skip_root()`.
 4. For paths which subsequently include a `..`, this results in the
    `output > start` check in the `..` loop below not skipping all the
    characters of a preceding path component, which is then caught by
    the `G_IS_DIR_SEPARATOR (output[-1])` assertion.

Fix this by resetting `start` to `output` after finding the final slash
to keep in the output, but before starting the main parsing loop.

Relatedly, split `start` into two variables: `after_root` and
`output_start`, since the variable actually has two roles in the two
parts of the function.

Includes a test.

This commit is heavily based on suggestions by Sebastian Wilhemi and
Sebastian Dröge.

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

oss-fuzz#41563
2021-12-02 18:47:39 +00:00
..
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2019-05-27 17:51:40 +00:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2020-06-23 10:49:44 +01:00
2017-05-24 11:58:19 +02:00
2021-07-29 10:09:27 -04:00
2017-05-24 11:58:19 +02:00
2021-05-28 17:15:46 +02:00
2021-05-28 17:15:46 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2021-10-18 13:20:48 +01:00
2020-11-17 15:50:07 +00:00
2018-01-04 22:19:30 +01:00
2019-11-25 13:09:25 +01:00
2017-05-24 11:58:19 +02:00
2021-07-24 11:26:40 -04:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2019-03-15 21:30:22 +01:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2021-07-21 13:49:48 +02:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00
2019-11-25 13:09:25 +01:00
2021-09-27 14:40:18 +01:00
2019-09-18 10:47:23 +02:00
2021-09-20 10:10:19 +01:00
2017-05-24 11:58:19 +02:00
2021-05-13 22:16:27 +01:00
2020-05-12 12:41:22 +01:00
2021-03-23 11:36:57 +00:00
2021-03-23 11:36:57 +00:00
2017-05-24 11:58:19 +02:00
2021-07-29 10:09:27 -04:00
2017-05-24 11:58:19 +02:00
2021-08-02 14:52:06 +01:00
2017-05-24 11:58:19 +02:00
2017-05-24 11:58:19 +02:00