Calling bare free() is not enough for complex types.
Reported-at:
https://mail.openvswitch.org/pipermail/ovs-dev/2026-August/435059.html
Reported-by: Ilya Maximets <[email protected]>
Fixes: 93fe02646664 ("ovsdb-idl: idl compound indexes implementation")
Signed-off-by: Dumitru Ceara <[email protected]>
---
NOTE: the ternary operator spacing matches that of the other ternary
operators in the same functions. I can post a v2 patch set with a
second patch that fixes the spacing everywhere if maintainers request
one but for now I decided against that.
---
lib/ovsdb-idl.c | 3 +-
tests/ovsdb-idl.at | 140 ++++++++++++++++++++++-----------------------
tests/test-ovsdb.c | 22 +++++++
3 files changed, 93 insertions(+), 72 deletions(-)
diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index e971b0e2fc70..bbae1d0380b4 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -2183,8 +2183,7 @@ ovsdb_idl_index_write(struct ovsdb_idl_row *const_row,
size_t column_idx = column - class->columns;
if (bitmap_is_set(row->written, column_idx)) {
- free(row->new_datum[column_idx].values);
- free(row->new_datum[column_idx].keys);
+ ovsdb_datum_destroy(&row->new_datum[column_idx], &column->type);
} else {
bitmap_set1(row->written, column_idx);
}
diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at
index cd534e09d51f..9b15218ea306 100644
--- a/tests/ovsdb-idl.at
+++ b/tests/ovsdb-idl.at
@@ -2192,10 +2192,10 @@
OVSDB_CHECK_IDL_COMPOUND_INDEX_SINGLE_COLUMN_C([Compound_index, single column te
001: s=List005
001: s=List020
001: s=List020
-003: s=List001
-003: s=List001
-003: s=List001
-003: s=List001
+004: s=List001
+004: s=List001
+004: s=List001
+004: s=List001
],
[001: s=List000 i=1 b=True r=101.000000
001: s=List000 i=10 b=True r=110.000000
@@ -2207,10 +2207,10 @@
OVSDB_CHECK_IDL_COMPOUND_INDEX_SINGLE_COLUMN_C([Compound_index, single column te
001: s=List005 i=5 b=True r=130.000000
001: s=List020 i=19 b=True r=219.000000
001: s=List020 i=20 b=True r=220.000000
-003: s=List001 i=1 b=False r=110.000000
-003: s=List001 i=2 b=True r=120.000000
-003: s=List001 i=2 b=True r=122.000000
-003: s=List001 i=4 b=True r=130.000000
+004: s=List001 i=1 b=False r=110.000000
+004: s=List001 i=2 b=True r=120.000000
+004: s=List001 i=2 b=True r=122.000000
+004: s=List001 i=4 b=True r=130.000000
],
[002: i=1
002: i=1
@@ -2222,29 +2222,29 @@
OVSDB_CHECK_IDL_COMPOUND_INDEX_SINGLE_COLUMN_C([Compound_index, single column te
002: i=10
002: i=19
002: i=20
-004: i=5
-005: i=4
005: i=5
+006: i=4
006: i=5
-006: i=10
-006: i=19
-006: i=20
-006: i=54
007: i=5
+007: i=10
007: i=19
007: i=20
-007: i=30
007: i=54
-008: i=1
-008: i=1
-008: i=2
-008: i=2
-008: i=2
008: i=5
008: i=19
008: i=20
008: i=30
008: i=54
+009: i=1
+009: i=1
+009: i=2
+009: i=2
+009: i=2
+009: i=5
+009: i=19
+009: i=20
+009: i=30
+009: i=54
],
[002: i=1 s=List000 b=True r=101.000000
002: i=1 s=List001 b=False r=110.000000
@@ -2256,29 +2256,29 @@
OVSDB_CHECK_IDL_COMPOUND_INDEX_SINGLE_COLUMN_C([Compound_index, single column te
002: i=20 s=List020 b=True r=220.000000
002: i=4 s=List001 b=True r=130.000000
002: i=5 s=List005 b=True r=130.000000
-004: i=5 s=List005 b=True r=130.000000
-005: i=4 s=List001 b=True r=130.000000
005: i=5 s=List005 b=True r=130.000000
-006: i=10 s=List000 b=True r=110.000000
-006: i=19 s=List020 b=True r=219.000000
-006: i=20 s=List020 b=True r=220.000000
+006: i=4 s=List001 b=True r=130.000000
006: i=5 s=List005 b=True r=130.000000
-006: i=54 s=Lista054 b=False r=0.000000
+007: i=10 s=List000 b=True r=110.000000
007: i=19 s=List020 b=True r=219.000000
007: i=20 s=List020 b=True r=220.000000
-007: i=30 s=List000 b=True r=110.000000
007: i=5 s=List005 b=True r=130.000000
007: i=54 s=Lista054 b=False r=0.000000
-008: i=1 s=List000 b=True r=101.000000
-008: i=1 s=List001 b=False r=110.000000
008: i=19 s=List020 b=True r=219.000000
-008: i=2 s=List000 b=False r=102.000000
-008: i=2 s=List001 b=True r=120.000000
-008: i=2 s=List001 b=True r=122.000000
008: i=20 s=List020 b=True r=220.000000
008: i=30 s=List000 b=True r=110.000000
008: i=5 s=List005 b=True r=130.000000
008: i=54 s=Lista054 b=False r=0.000000
+009: i=1 s=List000 b=True r=101.000000
+009: i=1 s=List001 b=False r=110.000000
+009: i=19 s=List020 b=True r=219.000000
+009: i=2 s=List000 b=False r=102.000000
+009: i=2 s=List001 b=True r=120.000000
+009: i=2 s=List001 b=True r=122.000000
+009: i=20 s=List020 b=True r=220.000000
+009: i=30 s=List000 b=True r=110.000000
+009: i=5 s=List005 b=True r=130.000000
+009: i=54 s=Lista054 b=False r=0.000000
])
# Tests to verify the functionality of two column compound index.
@@ -2350,11 +2350,11 @@
OVSDB_CHECK_IDL_COMPOUND_INDEX_DOUBLE_COLUMN_C([Compound_index, double column te
002: s=List020 i=20
002: s=List020 i=19
003: s=List000 i=10
-004: s=List001 i=1
-004: s=List001 i=2
-004: s=List001 i=2
-004: s=List001 i=4
-004: s=List005 i=5
+005: s=List001 i=1
+005: s=List001 i=2
+005: s=List001 i=2
+005: s=List001 i=4
+005: s=List005 i=5
],
[001: s=List000 i=1 b=True r=101.000000
001: s=List000 i=10 b=True r=110.000000
@@ -2377,44 +2377,34 @@
OVSDB_CHECK_IDL_COMPOUND_INDEX_DOUBLE_COLUMN_C([Compound_index, double column te
002: s=List020 i=19 b=True r=219.000000
002: s=List020 i=20 b=True r=220.000000
003: s=List000 i=10 b=True r=110.000000
-004: s=List001 i=1 b=False r=110.000000
-004: s=List001 i=2 b=True r=120.000000
-004: s=List001 i=2 b=True r=122.000000
-004: s=List001 i=4 b=True r=130.000000
-004: s=List005 i=5 b=True r=130.000000
+005: s=List001 i=1 b=False r=110.000000
+005: s=List001 i=2 b=True r=120.000000
+005: s=List001 i=2 b=True r=122.000000
+005: s=List001 i=4 b=True r=130.000000
+005: s=List005 i=5 b=True r=130.000000
],
- [005: i=1 s=List000
-005: i=1 s=List001
-005: i=2 s=List000
-005: i=2 s=List001
-005: i=2 s=List001
-005: i=4 s=List001
-005: i=5 s=List005
-005: i=10 s=List000
-005: i=19 s=List020
-005: i=20 s=List020
-006: i=20 s=List020
-006: i=19 s=List020
-006: i=10 s=List000
-006: i=5 s=List005
-006: i=4 s=List001
+ [006: i=1 s=List000
+006: i=1 s=List001
006: i=2 s=List000
006: i=2 s=List001
006: i=2 s=List001
-006: i=1 s=List000
-006: i=1 s=List001
+006: i=4 s=List001
+006: i=5 s=List005
+006: i=10 s=List000
+006: i=19 s=List020
+006: i=20 s=List020
+007: i=20 s=List020
+007: i=19 s=List020
+007: i=10 s=List000
+007: i=5 s=List005
+007: i=4 s=List001
+007: i=2 s=List000
+007: i=2 s=List001
+007: i=2 s=List001
+007: i=1 s=List000
+007: i=1 s=List001
],
- [005: i=1 s=List000 b=True r=101.000000
-005: i=1 s=List001 b=False r=110.000000
-005: i=10 s=List000 b=True r=110.000000
-005: i=19 s=List020 b=True r=219.000000
-005: i=2 s=List000 b=False r=102.000000
-005: i=2 s=List001 b=True r=120.000000
-005: i=2 s=List001 b=True r=122.000000
-005: i=20 s=List020 b=True r=220.000000
-005: i=4 s=List001 b=True r=130.000000
-005: i=5 s=List005 b=True r=130.000000
-006: i=1 s=List000 b=True r=101.000000
+ [006: i=1 s=List000 b=True r=101.000000
006: i=1 s=List001 b=False r=110.000000
006: i=10 s=List000 b=True r=110.000000
006: i=19 s=List020 b=True r=219.000000
@@ -2424,6 +2414,16 @@
OVSDB_CHECK_IDL_COMPOUND_INDEX_DOUBLE_COLUMN_C([Compound_index, double column te
006: i=20 s=List020 b=True r=220.000000
006: i=4 s=List001 b=True r=130.000000
006: i=5 s=List005 b=True r=130.000000
+007: i=1 s=List000 b=True r=101.000000
+007: i=1 s=List001 b=False r=110.000000
+007: i=10 s=List000 b=True r=110.000000
+007: i=19 s=List020 b=True r=219.000000
+007: i=2 s=List000 b=False r=102.000000
+007: i=2 s=List001 b=True r=120.000000
+007: i=2 s=List001 b=True r=122.000000
+007: i=20 s=List020 b=True r=220.000000
+007: i=4 s=List001 b=True r=130.000000
+007: i=5 s=List005 b=True r=130.000000
])
m4_define([OVSDB_CHECK_IDL_COMPOUND_INDEX_WITH_REF],
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index a162e2979c50..00b249889925 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -3317,6 +3317,16 @@ test_idl_compound_index_single_column(struct ovsdb_idl
*idl,
*/
++step;
struct idltest_simple *equal = idltest_simple_index_init_row(s_index);
+ idltest_simple_index_set_s(equal, "List100");
+ ovs_assert(strcmp(equal->s, "List100") == 0);
+ IDLTEST_SIMPLE_FOR_EACH_EQUAL (myRow, equal, s_index) {
+ printf("%03d: s=%s i=%"PRId64" b=%s r=%f\n", step, myRow->s,
+ myRow->i, myRow->b?"True":"False", myRow->r);
+ }
+ /* Display records by string index -> s_index with filtering
+ * where s="List001". Reuse the 'equal' index.
+ */
+ ++step;
idltest_simple_index_set_s(equal, "List001");
ovs_assert(strcmp(equal->s, "List001") == 0);
IDLTEST_SIMPLE_FOR_EACH_EQUAL (myRow, equal, s_index) {
@@ -3451,6 +3461,18 @@ test_idl_compound_index_double_column(struct
ovsdb_idl_index *si_index,
printf("%03d: s=%s i=%"PRId64" b=%s r=%f\n", step, myRow->s, myRow->i,
myRow->b?"True":"False", myRow->r);
}
+
+ /* Display records by string-integer index -> si_index with filtering
+ * where s="List100" and i=10. Reuse the 'equal' index.
+ */
+ step++;
+ idltest_simple_index_set_s(equal, "List100");
+ ovs_assert(strcmp(equal->s, "List100") == 0);
+ IDLTEST_SIMPLE_FOR_EACH_EQUAL (myRow, equal, si_index) {
+ printf("%03d: s=%s i=%"PRId64" b=%s r=%f\n", step, myRow->s, myRow->i,
+ myRow->b?"True":"False", myRow->r);
+ }
+
/* Display records by string-integer index -> si_index in range i=[0,100]
* and s=[\"List002\",\"List003\"]
*/
--
2.55.0
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev