mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-12 09:10:31 +01:00
all: use wrappers for g_ascii_strtoll(), g_ascii_strtoull(), g_ascii_strtod()
Sometimes these function may set errno to unexpected values like EAGAIN.
This causes confusion. Avoid that by using our own wrappers that retry
in that case. For example, in rhbz#1797915 we have failures like:
errno = 0;
v = g_ascii_strtoll ("10", 0, &end);
if (errno != 0)
g_assert_not_reached ();
as g_ascii_strtoll() would return 10, but also set errno to EAGAIN.
Work around that by using wrapper functions that retry. This certainly
should be fixed in glib (or glibc), but the issues are severe enough to
warrant a workaround.
Note that our workarounds are very defensive. We only retry 2 times, if
we get an unexpected errno value. This is in the hope to recover from
a spurious EAGAIN. It won't recover from other errors.
https://bugzilla.redhat.com/show_bug.cgi?id=1797915
(cherry picked from commit 7e49f4a199)
This commit is contained in:
parent
95565bef77
commit
eec2740d71
3 changed files with 7 additions and 7 deletions
|
|
@ -2298,7 +2298,7 @@ _nm_utils_parse_tc_handle (const char *str, GError **error)
|
|||
|
||||
nm_assert (str);
|
||||
|
||||
maj = g_ascii_strtoll (str, (char **) &sep, 0x10);
|
||||
maj = nm_g_ascii_strtoll (str, (char **) &sep, 0x10);
|
||||
if (sep == str)
|
||||
goto fail;
|
||||
|
||||
|
|
@ -2307,7 +2307,7 @@ _nm_utils_parse_tc_handle (const char *str, GError **error)
|
|||
if (sep[0] == ':') {
|
||||
const char *str2 = &sep[1];
|
||||
|
||||
min = g_ascii_strtoll (str2, (char **) &sep, 0x10);
|
||||
min = nm_g_ascii_strtoll (str2, (char **) &sep, 0x10);
|
||||
sep = nm_str_skip_leading_spaces (sep);
|
||||
if (sep[0] != '\0')
|
||||
goto fail;
|
||||
|
|
|
|||
|
|
@ -1062,7 +1062,7 @@ _nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 ma
|
|||
}
|
||||
|
||||
errno = 0;
|
||||
v = g_ascii_strtoll (str, (char **) &s, base);
|
||||
v = nm_g_ascii_strtoll (str, (char **) &s, base);
|
||||
|
||||
if (errno != 0)
|
||||
return fallback;
|
||||
|
|
@ -1098,7 +1098,7 @@ _nm_utils_ascii_str_to_uint64 (const char *str, guint base, guint64 min, guint64
|
|||
}
|
||||
|
||||
errno = 0;
|
||||
v = g_ascii_strtoull (str, (char **) &s, base);
|
||||
v = nm_g_ascii_strtoull (str, (char **) &s, base);
|
||||
|
||||
if (errno != 0)
|
||||
return fallback;
|
||||
|
|
@ -1117,8 +1117,8 @@ _nm_utils_ascii_str_to_uint64 (const char *str, guint base, guint64 min, guint64
|
|||
|
||||
if ( v != 0
|
||||
&& str[0] == '-') {
|
||||
/* I don't know why, but g_ascii_strtoull() accepts minus signs ("-2" gives 18446744073709551614).
|
||||
* For "-0" that is OK, but otherwise not. */
|
||||
/* As documented, g_ascii_strtoull() accepts negative values, and returns their
|
||||
* absolute value. We don't. */
|
||||
errno = ERANGE;
|
||||
return fallback;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -540,7 +540,7 @@ make_connection_setting (const char *file,
|
|||
char *endptr;
|
||||
double d;
|
||||
|
||||
d = g_ascii_strtod (v, &endptr);
|
||||
d = nm_g_ascii_strtod (v, &endptr);
|
||||
endptr = nm_str_skip_leading_spaces (endptr);
|
||||
if ( errno == 0
|
||||
&& endptr[0] == '\0'
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue