Simon McVittie
e807966b84
strfuncs: Don't let get_C_locale() clobber errno
...
Some callers of `g_ascii_strtoull()` and similar functions assume that
they can use this pattern, similar to what they might do for
Standard C `strtoull()`:
errno = 0;
result = g_ascii_strtoull (nptr, endptr, base);
saved_errno = errno;
if (saved_errno != 0)
g_printerr ("error parsing %s\n", nptr);
This is based on the fact that it is non-trivial to tell whether
`strtoull()` and related functions succeeded (in which case the value
of `errno` is unspecified) or failed (in which case `errno` is valid).
For example, POSIX `strtoul(3)` suggests this pattern:
> Since 0, `ULONG_MAX`, and `ULLONG_MAX` are returned on error and are
> also valid returns on success, an application wishing to check for
> error situations should set `errno` to 0, then call `strtoul()` or
> `strtoull()`, then check `errno`.
However, `g_ascii_strtoull()` does not *only* call a function resembling
`strtoull()` (`strtoull_l()` or its reimplementation
`g_parse_long_long()`): it also calls `get_C_locale()`, which wraps
`newlocale()`. Even if `newlocale()` succeeds (which in practice we
expect and assume that it will), it is valid for it to clobber `errno`.
For example, it might attempt to open a file that only conditionally
exists, which would leave `errno` set to `ENOENT`.
This is difficult to reproduce in practice: I encountered what I
believe to be this bug when compiling GLib-based software for i386 in a
Debian 12 derivative via an Open Build Service instance, but I could
not reproduce the bug in a similar chroot environment locally, and I
also could not reproduce the bug when compiling for x86_64 or for a
Debian 10, 11 or 13 derivative on the same Open Build Service instance.
It also cannot be reproduced via the GTest framework, because
`g_test_init()` indirectly calls `g_ascii_strtoull()`, resulting in
the call to `newlocale()` already having happened by the time we enter
test code.
Resolves: https://gitlab.gnome.org/GNOME/glib/-/issues/3418
Signed-off-by: Simon McVittie <smcv@collabora.com>
2024-07-26 13:08:27 +01:00
..
2024-01-15 12:39:36 +00:00
2021-04-19 19:23:10 +01:00
2019-01-15 15:11:43 +00:00
2024-05-11 01:25:12 +02:00
2022-10-13 20:53:56 -04:00
2024-07-04 19:35:47 +00:00
2024-01-09 08:55:32 -08:00
2022-05-18 09:19:02 +01:00
2023-10-11 14:01:28 +01:00
2024-06-28 15:27:25 +01:00
2023-01-06 12:09:37 +00:00
2024-06-30 21:32:33 +02:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2023-11-28 13:52:05 +00:00
2023-10-10 08:30:46 -07:00
2023-03-23 14:11:36 +00:00
2022-11-07 11:30:32 +00:00
2024-04-25 12:39:33 +01:00
2022-05-18 09:19:02 +01:00
2024-03-18 13:55:36 +00:00
2024-01-16 12:50:31 +01:00
2023-10-11 17:38:30 +01:00
2024-04-03 10:54:22 +01:00
2018-06-02 09:45:55 +02:00
2023-05-16 11:27:45 +01:00
2022-05-18 09:19:02 +01:00
2023-10-04 13:57:16 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2023-11-02 16:30:23 +00:00
2023-11-02 16:30:23 +00:00
2023-10-03 10:00:44 +00:00
2023-10-03 10:26:10 +02:00
2024-04-01 11:01:06 +00:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2024-02-05 16:49:10 +01:00
2022-05-23 09:19:45 -04:00
2024-01-31 17:30:28 +01:00
2024-04-25 12:39:33 +01:00
2023-10-11 17:38:31 +01:00
2023-11-28 23:14:40 +00:00
2023-11-28 23:13:27 +00:00
2024-04-26 10:28:47 +01:00
2023-12-20 07:48:10 -05:00
2023-11-23 12:34:39 +00:00
2023-11-23 12:34:39 +00:00
2023-10-17 22:59:27 +01:00
2024-04-25 12:39:33 +01:00
2022-05-18 09:19:02 +01:00
2023-12-14 01:26:42 +00:00
2022-05-18 09:19:02 +01:00
2024-04-25 12:39:33 +01:00
2022-05-18 09:19:02 +01:00
2023-10-11 14:01:29 +01:00
2022-05-18 09:19:02 +01:00
2023-12-04 09:53:35 +00:00
2022-12-16 18:45:36 +01:00
2023-11-15 11:09:39 +00:00
2023-11-15 11:09:39 +00:00
2023-11-29 11:59:47 +00:00
2023-01-09 13:09:26 +01:00
2024-04-25 23:58:08 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2023-11-15 11:09:39 +00:00
2024-04-01 11:01:06 +00:00
2023-05-18 11:26:33 +02:00
2023-10-12 11:44:48 +02:00
2024-04-02 08:40:48 -03:00
2022-07-25 01:00:54 +02:00
2023-10-23 10:25:31 +01:00
2022-05-18 09:19:02 +01:00
2023-09-04 11:29:57 +00:00
2023-07-21 18:40:13 +01:00
2022-05-18 09:19:02 +01:00
2023-10-23 10:25:30 +01:00
2024-06-14 12:35:21 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2024-01-31 16:51:50 +00:00
2024-07-09 20:34:02 +02:00
2022-11-22 17:23:12 +01:00
2024-06-04 16:57:18 +01:00
2024-02-09 21:59:59 +00:00
2023-03-23 14:11:36 +00:00
2023-02-09 13:36:51 +00:00
2018-01-04 22:19:30 +01:00
2024-04-01 11:01:06 +00:00
2024-02-21 12:38:40 +01:00
2013-01-13 13:11:57 -05:00
2023-11-29 11:59:47 +00:00
2022-05-18 09:19:02 +01:00
2024-07-23 12:25:35 +02:00
2022-05-18 09:19:02 +01:00
2024-05-28 14:27:43 +05:30
2024-07-04 10:40:20 +00:00
2023-02-21 12:42:55 +00:00
2022-05-18 09:19:02 +01:00
2023-11-29 12:03:15 +00:00
2022-07-25 22:30:22 +01:00
2024-05-24 10:16:51 +00:00
2023-05-30 13:45:05 +01:00
2024-04-25 12:39:33 +01:00
2024-03-05 11:06:10 +00:00
2021-09-21 09:41:29 +00:00
2024-07-15 15:58:45 +00:00
2023-01-09 13:09:26 +01:00
2024-05-16 12:50:08 +00:00
2023-08-21 11:34:27 +01:00
2021-11-18 14:32:09 +00:00
2023-10-11 17:38:31 +01:00
2023-10-11 17:38:31 +01:00
2024-05-23 10:36:50 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2024-01-25 11:19:23 +00:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2024-07-09 20:16:20 +01:00
2024-06-28 15:27:18 +01:00
2023-11-28 13:52:05 +00:00
2022-05-18 09:19:02 +01:00
2023-11-29 11:59:47 +00:00
2022-05-18 09:19:02 +01:00
2023-11-28 13:52:05 +00:00
2022-05-18 09:19:02 +01:00
2023-10-11 14:01:28 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2023-10-11 14:01:28 +01:00
2023-04-24 12:48:32 +01:00
2023-10-11 17:38:30 +01:00
2022-05-18 09:19:02 +01:00
2023-12-18 11:23:56 +00:00
2023-10-11 17:38:31 +01:00
2023-11-29 11:59:47 +00:00
2022-05-18 09:19:02 +01:00
2023-10-17 22:59:27 +01:00
2024-04-25 23:16:04 +01:00
2023-01-09 13:09:26 +01:00
2023-11-28 13:52:05 +00:00
2022-05-18 09:19:02 +01:00
2023-10-11 14:01:29 +01:00
2024-02-09 10:08:00 +00:00
2023-11-29 11:59:47 +00:00
2022-05-18 09:19:02 +01:00
2024-07-15 16:40:55 +01:00
2024-07-15 16:40:55 +01:00
2022-11-03 00:11:45 +08:00
2024-07-15 16:40:55 +01:00
2024-07-15 16:40:55 +01:00
2023-01-09 14:12:16 +01:00
2022-05-18 09:19:02 +01:00
2023-05-31 16:34:16 +01:00
2023-11-23 12:34:39 +00:00
2024-04-01 11:01:06 +00:00
2024-07-26 13:08:27 +01:00
2024-05-18 23:34:20 +02:00
2024-04-25 12:39:33 +01:00
2023-05-16 11:27:45 +01:00
2023-10-23 10:25:31 +01:00
2022-05-18 09:19:02 +01:00
2024-03-22 00:08:26 +00:00
2024-03-22 00:08:26 +00:00
2024-03-25 15:17:59 -04:00
2023-08-16 14:31:40 +01:00
2024-06-26 20:02:18 +09:00
2023-11-23 12:18:21 +00:00
2024-07-24 16:47:47 +02:00
2024-07-24 16:47:47 +02:00
2024-07-24 16:47:47 +02:00
2024-01-17 08:57:12 -05:00
2023-10-23 10:25:31 +01:00
2022-05-18 09:19:02 +01:00
2024-07-24 16:47:47 +02:00
2023-10-11 17:38:31 +01:00
2022-05-18 09:19:02 +01:00
2024-04-25 23:58:18 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2023-11-28 13:52:05 +00:00
2014-02-20 18:27:24 -05:00
2024-04-25 12:39:33 +01:00
2023-11-28 13:52:05 +00:00
2022-05-18 09:19:02 +01:00
2023-11-29 11:59:47 +00:00
2023-01-09 13:23:32 +01:00
2023-05-10 10:56:44 +07:00
2022-05-18 09:19:02 +01:00
2023-10-17 22:59:27 +01:00
2023-10-17 22:59:27 +01:00
2024-04-21 09:42:01 +02:00
2022-05-18 09:19:02 +01:00
2023-11-26 22:41:26 +00:00
2023-10-17 22:59:27 +01:00
2024-04-25 23:16:26 +01:00
2023-10-17 22:59:27 +01:00
2024-04-25 12:39:33 +01:00
2024-04-01 11:01:06 +00:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2024-04-25 12:39:33 +01:00
2024-04-25 12:39:33 +01:00
2022-11-22 17:23:13 +01:00
2023-11-08 16:36:14 +01:00
2023-11-28 13:52:05 +00:00
2017-02-06 14:40:38 +01:00
2022-05-18 09:19:02 +01:00
2024-01-16 11:04:44 +00:00
2022-12-13 18:15:19 +00:00
2022-05-18 09:19:02 +01:00
2024-04-25 12:39:33 +01:00
2024-04-25 23:16:13 +01:00
2022-12-13 18:15:19 +00:00
2024-04-25 23:58:30 +01:00
2023-02-10 18:22:20 +00:00
2024-01-19 11:53:00 +00:00
2023-11-29 12:03:34 +00:00
2023-07-21 18:40:13 +01:00
2022-05-18 09:19:02 +01:00
2023-11-28 13:52:05 +00:00
2022-05-18 09:19:02 +01:00
2022-10-13 20:53:56 -04:00
2023-10-11 17:38:31 +01:00
2022-05-18 09:19:02 +01:00
2022-05-18 09:19:02 +01:00
2024-04-01 11:01:06 +00:00
2024-02-12 17:54:10 +00:00
2016-05-23 10:52:10 -04:00
2024-07-15 16:40:55 +01:00
2023-03-21 14:21:18 +00:00
2020-11-17 15:50:07 +00:00
2024-04-01 11:01:06 +00:00
2023-08-01 15:33:21 -03:00