Skip to content

Commit 7c0158b

Browse files
committed
Reject invalid signed integers (rpm buildorder)
A parser was accepting string values like "42foo" while a specification required an integer. Invalid values are rejected now. /data/components/rpm/*/buildorder fileds in modulemd documents is one of places.
1 parent 4f5b813 commit 7c0158b

File tree

2 files changed

+117
-1
lines changed

2 files changed

+117
-1
lines changed

modulemd/modulemd-yaml-util.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,8 @@ modulemd_yaml_parse_bool (yaml_parser_t *parser, GError **error)
426426
gint64
427427
modulemd_yaml_parse_int64 (yaml_parser_t *parser, GError **error)
428428
{
429+
gint64 value;
430+
gchar *endptr;
429431
MMD_INIT_YAML_EVENT (event);
430432

431433
YAML_PARSER_PARSE_WITH_EXIT_INT (parser, &event, error);
@@ -434,7 +436,53 @@ modulemd_yaml_parse_int64 (yaml_parser_t *parser, GError **error)
434436
MMD_YAML_ERROR_EVENT_EXIT_INT (error, event, "String was not a scalar");
435437
}
436438

437-
return g_ascii_strtoll ((const gchar *)event.data.scalar.value, NULL, 10);
439+
value =
440+
g_ascii_strtoll ((const gchar *)event.data.scalar.value, &endptr, 10);
441+
442+
if ((value == G_MAXINT64 && errno == ERANGE))
443+
{
444+
g_set_error (error,
445+
MODULEMD_YAML_ERROR,
446+
MODULEMD_ERROR_VALIDATE,
447+
"%s: The integer value is larger than %" G_GINT64_FORMAT,
448+
(const gchar *)event.data.scalar.value,
449+
G_MAXINT64);
450+
return 0;
451+
}
452+
453+
if ((value == G_MININT64 && errno == ERANGE))
454+
{
455+
g_set_error (error,
456+
MODULEMD_YAML_ERROR,
457+
MODULEMD_ERROR_VALIDATE,
458+
"%s: The integer value is samller than %" G_GINT64_FORMAT,
459+
(const gchar *)event.data.scalar.value,
460+
G_MININT64);
461+
return 0;
462+
}
463+
464+
if (value == 0 && errno == EINVAL)
465+
{
466+
g_set_error_literal (
467+
error,
468+
MODULEMD_YAML_ERROR,
469+
MODULEMD_ERROR_NOT_IMPLEMENTED,
470+
"Your GLib library does not support parsing integers in 10 base");
471+
return 0;
472+
}
473+
474+
if ((value == 0 && endptr == (gchar *)event.data.scalar.value) ||
475+
*endptr != '\0')
476+
{
477+
g_set_error (error,
478+
MODULEMD_YAML_ERROR,
479+
MMD_ERROR_VALIDATE,
480+
"%s: The string is not a valid integer",
481+
(const gchar *)event.data.scalar.value);
482+
return 0;
483+
}
484+
485+
return value;
438486
}
439487

440488

modulemd/tests/test-modulemd-parse_int64.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,62 @@
1919
#include "private/test-utils.h"
2020
#include <yaml.h>
2121

22+
static void
23+
test (const char *input, gint64 expected_value, gboolean expected_error)
24+
{
25+
gint64 parsed;
26+
g_autoptr (GError) error = NULL;
27+
MMD_INIT_YAML_EVENT (event);
28+
MMD_INIT_YAML_PARSER (parser);
29+
30+
yaml_parser_set_input_string (
31+
&parser, (const unsigned char *)input, strlen (input));
32+
parser_skip_document_start (&parser);
33+
34+
parsed = modulemd_yaml_parse_int64 (&parser, &error);
35+
if (expected_error)
36+
g_assert_nonnull (error);
37+
else
38+
g_assert_null (error);
39+
g_assert_cmpuint (parsed, ==, expected_value);
40+
}
41+
42+
static void
43+
test_int64_valid (void)
44+
{
45+
test ("42", 42, FALSE);
46+
}
47+
48+
static void
49+
test_int64_invalid_no_digit (void)
50+
{
51+
test ("foo", 0, TRUE);
52+
}
53+
54+
static void
55+
test_int64_invalid_incomplete (void)
56+
{
57+
test ("42foo", 0, TRUE);
58+
}
59+
60+
static void
61+
test_int64_valid_negative (void)
62+
{
63+
test ("-42", -42, FALSE);
64+
}
65+
66+
static void
67+
test_int64_invalid_too_big (void)
68+
{
69+
test ("9223372036854775808", 0, TRUE);
70+
}
71+
72+
static void
73+
test_int64_invalid_too_small (void)
74+
{
75+
test ("-9223372036854775809", 0, TRUE);
76+
}
77+
2278
static void
2379
utest (const char *input, guint64 expected_value, gboolean expected_error)
2480
{
@@ -76,6 +132,18 @@ main (int argc, char *argv[])
76132
setlocale (LC_ALL, "");
77133
g_test_init (&argc, &argv, NULL);
78134

135+
g_test_add_func ("/modulemd/v2/int64/yaml/parse/valid", test_int64_valid);
136+
g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_no_digit",
137+
test_int64_invalid_no_digit);
138+
g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_incomplete",
139+
test_int64_invalid_incomplete);
140+
g_test_add_func ("/modulemd/v2/int64/yaml/parse/valid_negative",
141+
test_int64_valid_negative);
142+
g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_too_big",
143+
test_int64_invalid_too_big);
144+
g_test_add_func ("/modulemd/v2/int64/yaml/parse/invalid_too_small",
145+
test_int64_invalid_too_small);
146+
79147
g_test_add_func ("/modulemd/v2/uint64/yaml/parse/valid", test_uint64_valid);
80148
g_test_add_func ("/modulemd/v2/uint64/yaml/parse/invalid_no_digit",
81149
test_uint64_invalid_no_digit);

0 commit comments

Comments
 (0)