mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-04 02:06:18 +01:00
gscanner: Avoid undefined behaviour copying between union members
It’s technically undefined behaviour in C to copy between two potentially-overlapping regions of memory (just like it is when calling `memcpy()`). This can easily happen with union members; and the ones in `GScanner` in particular. Fix that by copying through an intermediate variable. Coverity CID: #1427317, 1427340 Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
This commit is contained in:
parent
e1e32e9b0b
commit
add3be2086
@ -1696,12 +1696,19 @@ g_scanner_get_token_i (GScanner *scanner,
|
||||
scanner->config->int_2_float)
|
||||
{
|
||||
*token_p = G_TOKEN_FLOAT;
|
||||
|
||||
/* Have to assign through a temporary variable to avoid undefined behaviour
|
||||
* by copying between potentially-overlapping union members. */
|
||||
if (scanner->config->store_int64)
|
||||
{
|
||||
value_p->v_float = value_p->v_int64;
|
||||
gint64 temp = value_p->v_int64;
|
||||
value_p->v_float = temp;
|
||||
}
|
||||
else
|
||||
value_p->v_float = value_p->v_int;
|
||||
{
|
||||
gint temp = value_p->v_int;
|
||||
value_p->v_float = temp;
|
||||
}
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user