girnode: Improve int types in GIIrNodeUnion

`GIIrNodeUnion` is built dynamically at runtime (rather than being
mmapped from disk), so its types can accurately reflect their runtime
semantics, rather than an on-disk format.

As part of this, switch from `atoi()` to `g_ascii_string_to_unsigned()`
for parsing the relevant fields from a GIR XML file. This means we now
get error handling for invalid integers.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3155

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
This commit is contained in:
Philip Withnall 2024-01-26 09:21:22 +00:00
parent 2e7518bcc1
commit 0909b2e3ac
2 changed files with 8 additions and 3 deletions

View File

@ -384,7 +384,7 @@ struct _GIIrNodeUnion
size_t size; size_t size;
GIIrOffsetsState offsets_state; GIIrOffsetsState offsets_state;
int discriminator_offset; size_t discriminator_offset;
GIIrNodeType *discriminator_type; /* (owned) */ GIIrNodeType *discriminator_type; /* (owned) */
}; };

View File

@ -2810,6 +2810,8 @@ start_discriminator (GMarkupParseContext *context,
{ {
const char *type; const char *type;
const char *offset; const char *offset;
guint64 parsed_offset;
if (!(strcmp (element_name, "discriminator") == 0 && if (!(strcmp (element_name, "discriminator") == 0 &&
ctx->state == STATE_UNION)) ctx->state == STATE_UNION))
return FALSE; return FALSE;
@ -2829,8 +2831,11 @@ start_discriminator (GMarkupParseContext *context,
((GIIrNodeUnion *)CURRENT_NODE (ctx))->discriminator_type ((GIIrNodeUnion *)CURRENT_NODE (ctx))->discriminator_type
= parse_type (ctx, type); = parse_type (ctx, type);
((GIIrNodeUnion *)CURRENT_NODE (ctx))->discriminator_offset
= atoi (offset); if (g_ascii_string_to_unsigned (offset, 10, 0, G_MAXSIZE, &parsed_offset, error))
((GIIrNodeUnion *)CURRENT_NODE (ctx))->discriminator_offset = parsed_offset;
else
return FALSE;
return TRUE; return TRUE;
} }