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:
Philip Withnall 2020-11-03 16:59:36 +00:00
parent e1e32e9b0b
commit add3be2086

View File

@ -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;