# HG changeset patch # User Mychaela Falconia # Date 1657437435 28800 # Node ID 7dae2bae56a1f06e6f76c9f081add6e03aacb21f # Parent 2b072ad13de6c6b63a33fdd8951aa0877ba774a7 themwi-mgw: implement MDCX parameter validation diff -r 2b072ad13de6 -r 7dae2bae56a1 include/tmgw_ctrl.h --- a/include/tmgw_ctrl.h Sat Jul 09 22:52:44 2022 -0800 +++ b/include/tmgw_ctrl.h Sat Jul 09 23:17:15 2022 -0800 @@ -35,4 +35,6 @@ #define TMGW_RESP_OK 0 #define TMGW_RESP_ERR_PROT 1 #define TMGW_RESP_ERR_RSRC 2 -#define TMGW_RESP_ERR_UNKNOWN 3 +#define TMGW_RESP_ERR_OPCODE 3 +#define TMGW_RESP_ERR_PARAM 4 +#define TMGW_RESP_ERR_NOTSUP 5 diff -r 2b072ad13de6 -r 7dae2bae56a1 mgw/crcx.c --- a/mgw/crcx.c Sat Jul 09 22:52:44 2022 -0800 +++ b/mgw/crcx.c Sat Jul 09 23:17:15 2022 -0800 @@ -108,7 +108,7 @@ case TMGW_EP_TYPE_GATEWAY: break; default: - resp->res = TMGW_RESP_ERR_PROT; + resp->res = TMGW_RESP_ERR_PARAM; return; } ep = malloc(sizeof(struct endpoint)); diff -r 2b072ad13de6 -r 7dae2bae56a1 mgw/ctrl_prot.c --- a/mgw/ctrl_prot.c Sat Jul 09 22:52:44 2022 -0800 +++ b/mgw/ctrl_prot.c Sat Jul 09 23:17:15 2022 -0800 @@ -59,7 +59,7 @@ process_dlcx(conn, &req, &resp); break; default: - resp.res = TMGW_RESP_ERR_PROT; + resp.res = TMGW_RESP_ERR_OPCODE; } send(fd, &resp, sizeof resp, 0); } diff -r 2b072ad13de6 -r 7dae2bae56a1 mgw/mdcx.c --- a/mgw/mdcx.c Sat Jul 09 22:52:44 2022 -0800 +++ b/mgw/mdcx.c Sat Jul 09 23:17:15 2022 -0800 @@ -26,6 +26,22 @@ resp->res = TMGW_RESP_ERR_PROT; return(-1); } + if (req->gsm_addr.ss_family != AF_INET) { + resp->res = TMGW_RESP_ERR_PARAM; + return(-1); + } + switch (req->gsm_payload_msg_type) { + case GSM_TCHF_FRAME: + break; + case GSM_TCHF_FRAME_EFR: + case GSM_TCHH_FRAME: + case GSM_TCH_FRAME_AMR: + resp->res = TMGW_RESP_ERR_NOTSUP; + return(-1); + default: + resp->res = TMGW_RESP_ERR_PARAM; + return(-1); + } bcopy(&req->gsm_addr, &ep->rtp_gsm.remote_addr, sizeof(struct sockaddr_in)); ep->gsm_payload_type = req->gsm_payload_type; @@ -36,6 +52,18 @@ resp->res = TMGW_RESP_ERR_PROT; return(-1); } + if (req->pstn_addr.ss_family != AF_INET) { + resp->res = TMGW_RESP_ERR_PARAM; + return(-1); + } + switch (req->pstn_payload_type) { + case PSTN_CODEC_PCMU: + case PSTN_CODEC_PCMA: + break; + default: + resp->res = TMGW_RESP_ERR_PARAM; + return(-1); + } bcopy(&req->pstn_addr, &ep->rtp_pstn.remote_addr, sizeof(struct sockaddr_in)); ep->pstn_payload_type = req->pstn_payload_type;