ovsdb-idl: Fix bad logic in ovsdb_idl_txn_commit() state transitions.
authorBen Pfaff <blp@nicira.com>
Sat, 27 Feb 2010 04:33:55 +0000 (20:33 -0800)
committerBen Pfaff <blp@nicira.com>
Sat, 27 Feb 2010 16:52:48 +0000 (08:52 -0800)
commit79554078d08b849059389f007a00c85b471d9e3d
tree67f72c8fd40a30245c6795d47660ad32fc9897c9
parentd4c2000bb24318b7a5e7cbf349ba107dd9c2cbe4
ovsdb-idl: Fix bad logic in ovsdb_idl_txn_commit() state transitions.

If sending the transaction fails (jsonrpc_session_send() returns 0),
then we need to transition to TXN_TRY_AGAIN.  (Transitioning to
TXN_INCOMPLETE is actually a no-op, because at this point in the code
we are guaranteed to be in that state already.)

Leaving the transaction in TXN_INCOMPLETE causes a segfault later in
ovsdb_idl_txn_destroy() when it calls hmap_remove() on the transaction's
txn_node.

This bug reveals a hole in the ovsdb_idl_txn state machine: destroying
a transaction without committing it or aborting it will cause the same
problem.  This problem is *not* fixed by this patch: it really should be
handled by adding a new state TXN_UNCOMMITTED that indicates that the
transaction is not yet committed or aborted.  That's too much for this
patch, and doesn't really matter for OVS at the moment since none of its
code paths destroy a transaction without committing or aborting it.

Bug #2435.
lib/ovsdb-idl.c