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

Reply via email to