@@ -710,6 +710,8 @@ ovsdb_idl_send_request(struct ovsdb_idl *idl, struct jsonrpc_msg *request)
idl->request_id = json_clone(request->id);
if (idl->session) {
jsonrpc_session_send(idl->session, request);
+ } else {
+ jsonrpc_msg_destroy(request);
}
}
@@ -4468,8 +4470,10 @@ ovsdb_idl_txn_commit(struct ovsdb_idl_txn *txn)
if (!any_updates) {
txn->status = TXN_UNCHANGED;
json_destroy(operations);
- } else if (txn->db->idl->session
- && !jsonrpc_session_send(
+ } else if (!txn->db->idl->session) {
+ txn->status = TXN_TRY_AGAIN;
+ json_destroy(operations);
+ } else if (!jsonrpc_session_send(
txn->db->idl->session,
jsonrpc_create_request(
"transact", operations, &txn->request_id))) {
@@ -5177,6 +5181,8 @@ ovsdb_idl_set_lock(struct ovsdb_idl *idl, const char *lock_name)
}
if (idl->session) {
jsonrpc_session_send(idl->session, msg);
+ } else {
+ jsonrpc_msg_destroy(msg);
}
}
}
When there's no open session, we still have to free the messages that we make but cannot send. I'm not confident that these fix actual bugs, because it seems possible that these code paths can only be hit when the session is nonnull. Signed-off-by: Ben Pfaff <blp@ovn.org> --- lib/ovsdb-idl.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)