Hi All. Please find below a patch fixing a memory leak detected in partial map update feature. It seems the original mail got lost and it hasn't been checked.
Arnoldo Lutz - Outsourced Contractor Software Engineer R&D, HP Networking Group Ultrapark I, Heredia, CR. arnoldo.lutz.guev...@hpe.com TÂ +506 2560-4430 x 4011 Hewlett-Packard Company Paseo de las Flores Heredia Costa Rica Please print thoughtfully -----Original Message----- From: Lutz, Arnoldo Sent: Monday, June 13, 2016 10:07 AM To: 'dev@openvswitch.org' <dev@openvswitch.org> Subject: Subject: [ovsdb-idl 1/1] Fix issues detected in Partial Map Update feature Hi. We found some issues affecting Partial Map Update feature included in master branch. This patch fixes a memory leak due to lack of freeing datum allocated in the process of requesting a change to a map. It also fix an error produced when NDEBUG flag is not set that causes an assertion when preparing the map to be changed. From 540230095eb5d552bb1cc559abb1bbdc668197b1 Mon Sep 17 00:00:00 2001 From: "arnoldo.lutz.guev...@hpe.com" <arnoldo.lutz.guev...@hpe.com> Date: Thu, 9 Jun 2016 09:41:00 -0700 Subject: [ovsdb-idl 1/1] Fix issues detected in Partial Map Update feature Fix of a memory leak not freeing datums. Change use of ovsdb_idl_read function when preparing changes to maps. Signed-off-by: arnoldo.lutz.guev...@hpe.com <arnoldo.lutz.guev...@hpe.com> --- lib/ovsdb-idl.c | 13 ++++++++++++- lib/ovsdb-map-op.c | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c index 2b372cb..b2b84c2 100644 --- a/lib/ovsdb-idl.c +++ b/lib/ovsdb-idl.c @@ -2225,7 +2225,16 @@ ovsdb_idl_txn_extract_mutations(struct ovsdb_idl_row *row, column = &class->columns[idx]; key_type = column->type.key.type; value_type = column->type.value.type; - old_datum = ovsdb_idl_read(row, column); + + /* Get the value to be changed */ + if (row->new && row->written && bitmap_is_set(row->written,idx)) { + old_datum = &row->new[idx]; + } else if (row->old != NULL) { + old_datum = &row->old[idx]; + } else { + old_datum = CONST_CAST(struct ovsdb_datum*, + ovsdb_datum_default(&column->type)); + } del_set = json_array_create_empty(); ins_map = json_array_create_empty(); @@ -3407,6 +3416,7 @@ ovsdb_idl_txn_write_partial_map(const struct ovsdb_idl_row *row_, if (!is_valid_partial_update(row, column, datum)) { ovsdb_datum_destroy(datum, &column->type); + free(datum); return; } @@ -3437,6 +3447,7 @@ ovsdb_idl_txn_delete_partial_map(const struct ovsdb_idl_row *row_, struct ovsdb_type type_ = column->type; type_.value.type = OVSDB_TYPE_VOID; ovsdb_datum_destroy(datum, &type_); + free(datum); return; } ovsdb_idl_txn_add_map_op(row, column, datum, MAP_OP_DELETE); diff --git a/lib/ovsdb-map-op.c b/lib/ovsdb-map-op.c index 58f43dc..23fc5f5 100644 --- a/lib/ovsdb-map-op.c +++ b/lib/ovsdb-map-op.c @@ -57,6 +57,7 @@ map_op_destroy_datum(struct map_op *map_op, const struct ovsdb_type *type) } else { ovsdb_datum_destroy(map_op->datum, type); } + free(map_op->datum); map_op->datum = NULL; } -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev