From 2c3b3e2fd9f7481ac59050ac39a93b5f0641ea4f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 26 Jul 2025 02:58:01 +0900 Subject: [PATCH] ordered-set: avoid overflow Previously, ordered_set_put_strdupv() and friends returns the number of pushed entries, but that is potentially larger than INT_MAX (of course, realistically, OOM is triggered in that case). No caller uses the number of the new entries. Let's return 1 when at least one element is added. Fixes CID#1611523. --- src/basic/ordered-set.c | 12 ++++++------ src/test/test-ordered-set.c | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/basic/ordered-set.c b/src/basic/ordered-set.c index 4d2c43cf363..09fdc3dfcee 100644 --- a/src/basic/ordered-set.c +++ b/src/basic/ordered-set.c @@ -61,7 +61,7 @@ int ordered_set_put_strdup_full(OrderedSet **s, const struct hash_ops *hash_ops, } int ordered_set_put_strdupv_full(OrderedSet **s, const struct hash_ops *hash_ops, char **l) { - int n = 0, r; + int r, ret = 0; assert(s); @@ -70,14 +70,14 @@ int ordered_set_put_strdupv_full(OrderedSet **s, const struct hash_ops *hash_ops if (r < 0) return r; - n += r; + ret = ret || r > 0; } - return n; + return ret; } int ordered_set_put_string_set_full(OrderedSet **s, const struct hash_ops *hash_ops, OrderedSet *l) { - int n = 0, r; + int r, ret = 0; char *p; assert(s); @@ -89,10 +89,10 @@ int ordered_set_put_string_set_full(OrderedSet **s, const struct hash_ops *hash_ if (r < 0) return r; - n += r; + ret = ret || r > 0; } - return n; + return ret; } void ordered_set_print(FILE *f, const char *field, OrderedSet *s) { diff --git a/src/test/test-ordered-set.c b/src/test/test-ordered-set.c index 7125dab2c24..a5cde0171a3 100644 --- a/src/test/test-ordered-set.c +++ b/src/test/test-ordered-set.c @@ -90,18 +90,19 @@ TEST(set_put_string_set) { _cleanup_ordered_set_free_ OrderedSet *m = NULL, *q = NULL; _cleanup_free_ char **final = NULL; /* "just free" because the strings are in the set */ - assert_se(ordered_set_put_strdup(&m, "1") == 1); - assert_se(ordered_set_put_strdup(&m, "22") == 1); - assert_se(ordered_set_put_strdup(&m, "333") == 1); + ASSERT_OK_POSITIVE(ordered_set_put_strdup(&m, "1")); + ASSERT_OK_POSITIVE(ordered_set_put_strdup(&m, "22")); + ASSERT_OK_POSITIVE(ordered_set_put_strdup(&m, "333")); - assert_se(ordered_set_put_strdup(&q, "11") == 1); - assert_se(ordered_set_put_strdup(&q, "22") == 1); - assert_se(ordered_set_put_strdup(&q, "33") == 1); + ASSERT_OK_POSITIVE(ordered_set_put_strdup(&q, "11")); + ASSERT_OK_POSITIVE(ordered_set_put_strdup(&q, "22")); + ASSERT_OK_POSITIVE(ordered_set_put_strdup(&q, "33")); - assert_se(ordered_set_put_string_set(&m, q) == 2); + ASSERT_OK_POSITIVE(ordered_set_put_string_set(&m, q)); + ASSERT_OK_ZERO(ordered_set_put_string_set(&m, q)); - assert_se(final = ordered_set_get_strv(m)); - assert_se(strv_equal(final, STRV_MAKE("1", "22", "333", "11", "33"))); + ASSERT_NOT_NULL(final = ordered_set_get_strv(m)); + ASSERT_TRUE(strv_equal(final, STRV_MAKE("1", "22", "333", "11", "33"))); ordered_set_print(stdout, "BAR=", m); } -- 2.47.3