[ovs-dev] [PATCH] ovsdb-idl: Don't even try to modify synthetic rows, instead of segfaulting.

Ethan Jackson ethan at nicira.com
Wed Oct 26 22:49:33 UTC 2011


Wouldn't we want to remove all of the synthetic checks from the bridge
as well?  I haven't looked at this closely yet.

Ethan

On Wed, Oct 26, 2011 at 15:47, Ben Pfaff <blp at nicira.com> wrote:
> 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 <ethan at nicira.com>
> ---
>  lib/ovsdb-idl.c |   26 ++++++++++++++++++++++----
>  1 files changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
> index 11ca6b9..56b4328 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);
> --
> 1.7.2.5
>
>



More information about the dev mailing list