mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-05-02 20:16:52 +02: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)
|
scanner->config->int_2_float)
|
||||||
{
|
{
|
||||||
*token_p = G_TOKEN_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)
|
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
|
else
|
||||||
value_p->v_float = value_p->v_int;
|
{
|
||||||
|
gint temp = value_p->v_int;
|
||||||
|
value_p->v_float = temp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user