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

Reply via email to