Module: sip-router Branch: master Commit: 6c7a0f3cdaee5ea0300d014f07e4d68f45c6e20b URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=6c7a0f3c...
Author: Peter Dunkley peter.dunkley@crocodilertc.net Committer: Peter Dunkley peter.dunkley@crocodilertc.net Date: Wed Oct 2 01:29:45 2013 +0100
modules/websocket: tidied up MI commands
- Fixed leak in error situations - Improved error responses
---
modules/websocket/ws_conn.c | 21 +++++++++++++++++---- modules/websocket/ws_frame.c | 19 +++++++++++++++---- 2 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/modules/websocket/ws_conn.c b/modules/websocket/ws_conn.c index 27a9968..263b49f 100644 --- a/modules/websocket/ws_conn.c +++ b/modules/websocket/ws_conn.c @@ -440,10 +440,7 @@ struct mi_root *ws_mi_dump(struct mi_root *cmd, void *param) int h, connections = 0, truncated = 0, order = 0, found = 0; ws_connection_t *wsc; struct mi_node *node = NULL; - struct mi_root *rpl_tree = init_mi_tree(200, MI_OK_S, MI_OK_LEN); - - if (!rpl_tree) - return 0; + struct mi_root *rpl_tree;
node = cmd->node.kids; if (node != NULL) @@ -476,6 +473,10 @@ struct mi_root *ws_mi_dump(struct mi_root *cmd, void *param) } }
+ rpl_tree = init_mi_tree(200, MI_OK_S, MI_OK_LEN); + if (rpl_tree == NULL) + return 0; + WSCONN_LOCK; if (order == 0) { @@ -485,7 +486,10 @@ struct mi_root *ws_mi_dump(struct mi_root *cmd, void *param) while(wsc) { if ((found = add_node(rpl_tree, wsc)) < 0) + { + free_mi_tree(rpl_tree); return 0; + }
connections += found; @@ -508,7 +512,10 @@ struct mi_root *ws_mi_dump(struct mi_root *cmd, void *param) while (wsc) { if ((found = add_node(rpl_tree, wsc)) < 0) + { + free_mi_tree(rpl_tree); return 0; + }
connections += found; if (connections >= MAX_WS_CONNS_DUMP) @@ -526,7 +533,10 @@ struct mi_root *ws_mi_dump(struct mi_root *cmd, void *param) while (wsc) { if ((found = add_node(rpl_tree, wsc)) < 0) + { + free_mi_tree(rpl_tree); return 0; + }
connections += found; if (connections >= MAX_WS_CONNS_DUMP) @@ -544,7 +554,10 @@ struct mi_root *ws_mi_dump(struct mi_root *cmd, void *param) "%d WebSocket connection%s found%s", connections, connections == 1 ? "" : "s", truncated == 1 ? "(truncated)" : "") == 0) + { + free_mi_tree(rpl_tree); return 0; + }
return rpl_tree; } diff --git a/modules/websocket/ws_frame.c b/modules/websocket/ws_frame.c index 086cf79..503722e 100644 --- a/modules/websocket/ws_frame.c +++ b/modules/websocket/ws_frame.c @@ -125,6 +125,7 @@ static str str_status_too_many_params = str_init("Too many parameters"); static str str_status_bad_param = str_init("Bad connection ID parameter"); static str str_status_error_closing = str_init("Error closing connection"); static str str_status_error_sending = str_init("Error sending frame"); +static str str_status_string_error = str_init("Error converting string to int");
static int encode_and_send_ws_frame(ws_frame_t *frame, conn_close_t conn_close) { @@ -726,7 +727,11 @@ struct mi_root *ws_mi_close(struct mi_root *cmd, void *param)
node = cmd->node.kids; if (node == NULL) - return 0; + { + LM_WARN("no connection ID parameter\n"); + return init_mi_tree(400, str_status_empty_param.s, + str_status_empty_param.len); + } if (node->value.s == NULL || node->value.len == 0) { LM_WARN("empty connection ID parameter\n"); @@ -736,7 +741,8 @@ struct mi_root *ws_mi_close(struct mi_root *cmd, void *param) if (str2int(&node->value, &id) < 0) { LM_ERR("converting string to int\n"); - return 0; + return init_mi_tree(400, str_status_string_error.s, + str_status_string_error.len); } if (node->next != NULL) { @@ -772,7 +778,11 @@ static struct mi_root *mi_ping_pong(struct mi_root *cmd, void *param,
node = cmd->node.kids; if (node == NULL) - return 0; + { + LM_WARN("no connection ID parameter\n"); + return init_mi_tree(400, str_status_empty_param.s, + str_status_empty_param.len); + } if (node->value.s == NULL || node->value.len == 0) { LM_WARN("empty connection ID parameter\n"); @@ -782,7 +792,8 @@ static struct mi_root *mi_ping_pong(struct mi_root *cmd, void *param, if (str2int(&node->value, &id) < 0) { LM_ERR("converting string to int\n"); - return 0; + return init_mi_tree(400, str_status_string_error.s, + str_status_string_error.len); } if (node->next != NULL) {