diff --git a/girepository/girnode-private.h b/girepository/girnode-private.h index 214e82bb2..e41678212 100644 --- a/girepository/girnode-private.h +++ b/girepository/girnode-private.h @@ -149,10 +149,10 @@ struct _GIIrNodeType uint8_t zero_terminated : 1; uint8_t has_length : 1; - int length; + unsigned int length; uint8_t has_size : 1; - int size; - int array_type; + size_t size; + GIArrayType array_type; GIIrNodeType *parameter_type1; /* (owned) */ GIIrNodeType *parameter_type2; /* (owned) */ diff --git a/girepository/girnode.c b/girepository/girnode.c index 2d0f818a0..eaad81bac 100644 --- a/girepository/girnode.c +++ b/girepository/girnode.c @@ -1243,7 +1243,7 @@ serialize_type (GIIrTypelibBuild *build, if (node->has_length) g_string_append_printf (str, "length=%d", node->length); else if (node->has_size) - g_string_append_printf (str, "fixed-size=%d", node->size); + g_string_append_printf (str, "fixed-size=%" G_GSIZE_FORMAT, node->size); if (node->zero_terminated) g_string_append_printf (str, "%szero-terminated=1", diff --git a/girepository/girparser.c b/girepository/girparser.c index 3924259a0..5de5177d4 100644 --- a/girepository/girparser.c +++ b/girepository/girparser.c @@ -2100,15 +2100,33 @@ start_type (GMarkupParseContext *context, } if (typenode->array_type == GI_ARRAY_TYPE_C) { + guint64 parsed_uint; + zero = find_attribute ("zero-terminated", attribute_names, attribute_values); len = find_attribute ("length", attribute_names, attribute_values); size = find_attribute ("fixed-size", attribute_names, attribute_values); typenode->has_length = len != NULL; - typenode->length = typenode->has_length ? atoi (len) : -1; + if (!typenode->has_length) + typenode->length = -1; + else if (g_ascii_string_to_unsigned (len, 10, 0, G_MAXUINT, &parsed_uint, error)) + typenode->length = parsed_uint; + else + { + gi_ir_node_free ((GIIrNode *) typenode); + return FALSE; + } typenode->has_size = size != NULL; - typenode->size = typenode->has_size ? atoi (size) : -1; + if (!typenode->has_size) + typenode->size = -1; + else if (g_ascii_string_to_unsigned (size, 10, 0, G_MAXSIZE, &parsed_uint, error)) + typenode->size = parsed_uint; + else + { + gi_ir_node_free ((GIIrNode *) typenode); + return FALSE; + } if (zero) typenode->zero_terminated = strcmp(zero, "1") == 0;