Skip to content

Commit

Permalink
ovsdb-server: Fix schema leak while reading db.
Browse files Browse the repository at this point in the history
parse_txn() function doesn't always take ownership of the 'schema'
passed.  So, if the schema of the clustered db has same version as the
one that already in use, parse_txn() will not use it, resulting with a
memory leak:

 7,827 (56 direct, 7,771 indirect) bytes in 1 blocks are definitely lost
    at 0x483BB1A: calloc (vg_replace_malloc.c:762)
    by 0x44AD02: xcalloc (util.c:121)
    by 0x40E70E: ovsdb_schema_create (ovsdb.c:41)
    by 0x40EA6D: ovsdb_schema_from_json (ovsdb.c:217)
    by 0x415EDD: ovsdb_storage_read (storage.c:280)
    by 0x408968: read_db (ovsdb-server.c:607)
    by 0x40733D: main_loop (ovsdb-server.c:227)
    by 0x40733D: main (ovsdb-server.c:469)

While we could put ovsdb_schema_destroy() in a few places inside
'parse_txn()', from the users' point of view it seems better to have a
constant argument and just clone the 'schema' if needed.  The caller
will be responsible for destroying the 'schema' it owns.

Fixes: 1b1d2e6 ("ovsdb: Introduce experimental support for clustered databases.")
Acked-by: Han Zhou <[email protected]>
Signed-off-by: Ilya Maximets <[email protected]>
  • Loading branch information
igsilya committed May 28, 2020
1 parent ede4466 commit 16e3a80
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions ovsdb/ovsdb-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,7 @@ close_db(struct server_config *config, struct db *db, char *comment)

static struct ovsdb_error * OVS_WARN_UNUSED_RESULT
parse_txn(struct server_config *config, struct db *db,
struct ovsdb_schema *schema, const struct json *txn_json,
const struct ovsdb_schema *schema, const struct json *txn_json,
const struct uuid *txnid)
{
if (schema && (!db->db->schema || strcmp(schema->version,
Expand All @@ -565,7 +565,7 @@ parse_txn(struct server_config *config, struct db *db,
? xasprintf("database %s schema changed", db->db->name)
: xasprintf("database %s connected to storage", db->db->name)));

ovsdb_replace(db->db, ovsdb_create(schema, NULL));
ovsdb_replace(db->db, ovsdb_create(ovsdb_schema_clone(schema), NULL));

/* Force update to schema in _Server database. */
db->row_uuid = UUID_ZERO;
Expand Down Expand Up @@ -614,6 +614,7 @@ read_db(struct server_config *config, struct db *db)
} else {
error = parse_txn(config, db, schema, txn_json, &txnid);
json_destroy(txn_json);
ovsdb_schema_destroy(schema);
if (error) {
break;
}
Expand Down

0 comments on commit 16e3a80

Please sign in to comment.