From 817a7602174fa0b77f971abfc29b08e2583f4682 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 3 Aug 2010 03:22:58 +0800 Subject: [PATCH] sccp_node: Add _err responses, fix a memleak and bug in the split_udt method the split_udt was reallocating an empty header and payload in the send_empty label that was always used.. --- src/sccp_node.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/sccp_node.c b/src/sccp_node.c index eb04ff6..9b6104b 100644 --- a/src/sccp_node.c +++ b/src/sccp_node.c @@ -82,7 +82,6 @@ static void copy_addr(struct sockaddr_sccp *addr, const struct osmo_erl_addr *so static int split_udt(int fd, ETERM *fromp, ETERM *argp) { struct msgb *msg = NULL; - char null; ETERM *resp, *hdr, *data; if (!ERL_IS_BINARY(argp)) { @@ -92,7 +91,7 @@ static int split_udt(int fd, ETERM *fromp, ETERM *argp) if (ERL_BIN_SIZE(argp) == 0) { printf("Empty input.\n"); - goto send_empty; + goto error; } else { struct sccp_parse_result result; struct osmo_erl_udt sccp_hdr; @@ -109,14 +108,10 @@ static int split_udt(int fd, ETERM *fromp, ETERM *argp) data = erl_mk_binary((const char *) msg->l3h, result.data_len); } else { printf("Failed to parse the header.\n"); - goto send_empty; + goto error; } } -send_empty: - hdr = erl_mk_binary(&null, 0); - data = erl_mk_binary(&null, 0); - resp = erl_format("{~a, {~w, ~w}}", UDT_SPLIT_RES, hdr, data); erl_send(fd, fromp, resp); erl_free_term(resp); @@ -127,6 +122,12 @@ send_empty: msgb_free(msg); return 0; + +error: + resp = erl_format("{~a, 23}", UDT_SPLIT_ERR); + erl_send(fd, fromp, resp); + erl_free_term(resp); + return -1; } /** @@ -158,21 +159,29 @@ static int wrap_udt(int fd, ETERM *fromp, ETERM *argp) ERL_BIN_PTR(payload), ERL_BIN_SIZE(payload)); if (!msg) { printf("Failed to create a UDT packet...\n"); - goto free_data; + goto error; } data = erl_mk_binary((const char * )msg->l2h, msgb_l2len(msg)); resp = erl_format("{~a, ~w}", UDT_WRAP_RES, data); erl_send(fd, fromp, resp); -free_data: erl_free_term(resp); erl_free_term(data); erl_free_term(hdr); erl_free_term(payload); if (msg) msgb_free(msg); + return 0; +error: + resp = erl_format("{~a, 23}", UDT_WRAP_ERR); + erl_send(fd, fromp, resp); + erl_free_term(resp); + erl_free_term(hdr); + erl_free_term(payload); + + return -1; } static int create_listen_socket(int port)