diff options
author | Ben Pfaff <blp@nicira.com> | 2010-01-12 10:51:30 -0800 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2010-01-12 14:28:00 -0800 |
commit | 7b8dbc8d8fd2d74bbc1afd6d6ec657c1ed8ad0a5 (patch) | |
tree | adbf09d8f25c2e9e48af9b3a5abb4b4441c978bf /lib/jsonrpc.c | |
parent | 9c8149dca0d205631a5bda57b0ccde1367b3bb96 (diff) |
jsonrpc: Fix memory leak in jsonrpc_session_send() when not connected.
Partial fix for bug #2373.
Diffstat (limited to 'lib/jsonrpc.c')
-rw-r--r-- | lib/jsonrpc.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c index f648f6b1..562a2870 100644 --- a/lib/jsonrpc.c +++ b/lib/jsonrpc.c @@ -172,6 +172,7 @@ jsonrpc_log_msg(const struct jsonrpc *rpc, const char *title, } } +/* Always takes ownership of 'msg', regardless of success. */ int jsonrpc_send(struct jsonrpc *rpc, struct jsonrpc_msg *msg) { @@ -268,6 +269,7 @@ jsonrpc_recv_wait(struct jsonrpc *rpc) } } +/* Always takes ownership of 'msg', regardless of success. */ int jsonrpc_send_block(struct jsonrpc *rpc, struct jsonrpc_msg *msg) { @@ -304,6 +306,7 @@ jsonrpc_recv_block(struct jsonrpc *rpc, struct jsonrpc_msg **msgp) } } +/* Always takes ownership of 'request', regardless of success. */ int jsonrpc_transact_block(struct jsonrpc *rpc, struct jsonrpc_msg *request, struct jsonrpc_msg **replyp) @@ -792,10 +795,16 @@ jsonrpc_session_get_name(const struct jsonrpc_session *s) return reconnect_get_name(s->reconnect); } +/* Always takes ownership of 'msg', regardless of success. */ int jsonrpc_session_send(struct jsonrpc_session *s, struct jsonrpc_msg *msg) { - return s->rpc ? jsonrpc_send(s->rpc, msg) : ENOTCONN; + if (s->rpc) { + return jsonrpc_send(s->rpc, msg); + } else { + jsonrpc_msg_destroy(msg); + return ENOTCONN; + } } struct jsonrpc_msg * |