diff options
author | Damijan Skvarc <damjan.skvarc@gmail.com> | 2019-10-25 14:22:58 +0200 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2019-10-25 10:50:34 -0700 |
commit | dee6478d4a05cc4112c7414ae0665df203a73d54 (patch) | |
tree | a77c5df6c049d3237970acdfc6d3be5b6340034c /ovsdb/file.c | |
parent | 9e334d91b3ea95e2b96f7b3edcb2ba9c3353288a (diff) | |
download | openvswitch-dee6478d4a05cc4112c7414ae0665df203a73d54.tar.gz |
ovsdb-server: fix memory leak while converting database
Memory leak happens while converting existing database into new
database according to the specified schema (ovsdb-client convert
new-schema). Memory leak was detected by valgrind while executing
functional test "schema conversion online - clustered"
==16202== 96 bytes in 6 blocks are definitely lost in loss record 326 of 399
==16202== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16202== by 0x44A5D4: xmalloc (util.c:138)
==16202== by 0x4377A6: alloc_default_atoms (ovsdb-data.c:315)
==16202== by 0x437F18: ovsdb_datum_init_default (ovsdb-data.c:918)
==16202== by 0x413D82: ovsdb_row_create (row.c:59)
==16202== by 0x40AA53: ovsdb_convert_table (file.c:220)
==16202== by 0x40AA53: ovsdb_convert (file.c:275)
==16202== by 0x416BE1: ovsdb_trigger_try (trigger.c:255)
==16202== by 0x40D29E: ovsdb_jsonrpc_trigger_create (jsonrpc-server.c:1119)
==16202== by 0x40D29E: ovsdb_jsonrpc_session_got_request (jsonrpc-server.c:986)
==16202== by 0x40D29E: ovsdb_jsonrpc_session_run (jsonrpc-server.c:556)
==16202== by 0x40D29E: ovsdb_jsonrpc_session_run_all (jsonrpc-server.c:586)
==16202== by 0x40D29E: ovsdb_jsonrpc_server_run (jsonrpc-server.c:401)
==16202== by 0x40682E: main_loop (ovsdb-server.c:209)
==16202== by 0x40682E: main (ovsdb-server.c:460)
The problem was in ovsdb_datum_convert() function, which overrides
pointers to datum memory allocated in ovsdb_row_create() function.
Fix was done by freeing this memory before ovsdb_datum_convert()
is called.
Signed-off-by: Damijan Skvarc <damjan.skvarc@gmail.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ovsdb/file.c')
-rw-r--r-- | ovsdb/file.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/ovsdb/file.c b/ovsdb/file.c index 8d16b097b..0af077fce 100644 --- a/ovsdb/file.c +++ b/ovsdb/file.c @@ -235,10 +235,14 @@ ovsdb_convert_table(struct ovsdb_txn *txn, continue; } + ovsdb_datum_destroy(&dst_row->fields[dst_column->index], + &dst_column->type); + struct ovsdb_error *error = ovsdb_datum_convert( &dst_row->fields[dst_column->index], &dst_column->type, &src_row->fields[src_column->index], &src_column->type); if (error) { + ovsdb_datum_init_empty(&dst_row->fields[dst_column->index]); ovsdb_row_destroy(dst_row); return error; } |