From 9b446bfaa25c3cf44ace4821bd06c675d432df56 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 26 Oct 2011 15:46:48 -0700 Subject: [PATCH] ovsdb-idl: Don't even try to modify synthetic rows, instead of segfaulting. Synthetic rows lack a lot of important metadata that the IDL adds to rows actually obtained from the database, and it's impractical to add that metadata to synthetic rows. This means that the IDL functions to modify these rows dereference null pointers and segfault. So, it's really important not to pass synthetic rows to such functions. However, we've screwed this up a number of times now and in the end it seems that it's probably better to just ignore attempts to modify these rows. This commit implements that. Feature #8013. Reported-by: Ethan Jackson --- lib/ovsdb-idl.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c index 11ca6b9f..56b43286 100644 --- a/lib/ovsdb-idl.c +++ b/lib/ovsdb-idl.c @@ -1705,8 +1705,15 @@ ovsdb_idl_txn_write(const struct ovsdb_idl_row *row_, struct ovsdb_datum *datum) { struct ovsdb_idl_row *row = (struct ovsdb_idl_row *) row_; - const struct ovsdb_idl_table_class *class = row->table->class; - size_t column_idx = column - class->columns; + const struct ovsdb_idl_table_class *class; + size_t column_idx; + + if (ovsdb_idl_row_is_synthetic(row)) { + return; + } + + class = row->table->class; + column_idx = column - class->columns; assert(row->new != NULL); assert(column_idx < class->n_columns); @@ -1782,8 +1789,15 @@ ovsdb_idl_txn_verify(const struct ovsdb_idl_row *row_, const struct ovsdb_idl_column *column) { struct ovsdb_idl_row *row = (struct ovsdb_idl_row *) row_; - const struct ovsdb_idl_table_class *class = row->table->class; - size_t column_idx = column - class->columns; + const struct ovsdb_idl_table_class *class; + size_t column_idx; + + if (ovsdb_idl_row_is_synthetic(row)) { + return; + } + + class = row->table->class; + column_idx = column - class->columns; assert(row->new != NULL); assert(row->old == NULL || @@ -1815,6 +1829,10 @@ ovsdb_idl_txn_delete(const struct ovsdb_idl_row *row_) { struct ovsdb_idl_row *row = (struct ovsdb_idl_row *) row_; + if (ovsdb_idl_row_is_synthetic(row)) { + return; + } + assert(row->new != NULL); if (!row->old) { ovsdb_idl_row_unparse(row); -- 2.30.2