aboutsummaryrefslogtreecommitdiff
path: root/lib/jsonrpc.c
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2010-01-12 10:51:30 -0800
committerBen Pfaff <blp@nicira.com>2010-01-12 14:28:00 -0800
commit7b8dbc8d8fd2d74bbc1afd6d6ec657c1ed8ad0a5 (patch)
treeadbf09d8f25c2e9e48af9b3a5abb4b4441c978bf /lib/jsonrpc.c
parent9c8149dca0d205631a5bda57b0ccde1367b3bb96 (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.c11
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 *