diff --git a/trunk/src/app/srs_app_gb28181_sip.cpp b/trunk/src/app/srs_app_gb28181_sip.cpp index 5b9a5d5b4..9348a35e2 100644 --- a/trunk/src/app/srs_app_gb28181_sip.cpp +++ b/trunk/src/app/srs_app_gb28181_sip.cpp @@ -441,6 +441,10 @@ srs_error_t SrsGb28181SipService::on_udp_sip(string peer_ip, int peer_port, if (req->is_register()) { std::vector serial = srs_string_split(srs_string_replace(req->uri,"sip:", ""), "@"); + if (serial.empty()){ + return srs_error_new(ERROR_GB28181_SIP_PRASE_FAILED, "register string split"); + } + if (serial.at(0) != config->sip_serial){ srs_warn("gb28181: client:%s request serial and server serial inconformity(%s:%s)", req->sip_auth_id.c_str(), serial.at(0).c_str(), config->sip_serial.c_str()); diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 45680a5fa..9b0e0578e 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -366,6 +366,7 @@ #define ERROR_GB28181_SIP_CH_OFFLINE 6012 #define ERROR_GB28181_SIP_CH_NOTEXIST 6013 #define ERROR_GB28181_SIP_RAW_DATA_FAILED 6014 +#define ERROR_GB28181_SIP_PRASE_FAILED 6015 /////////////////////////////////////////////////////// // HTTP API error. diff --git a/trunk/src/protocol/srs_sip_stack.cpp b/trunk/src/protocol/srs_sip_stack.cpp index 309e00473..e29fc4876 100644 --- a/trunk/src/protocol/srs_sip_stack.cpp +++ b/trunk/src/protocol/srs_sip_stack.cpp @@ -328,6 +328,10 @@ srs_error_t SrsSipStack::parse_xml(std::string xml_msg, std::map get DeviceList std::vector vec = srs_string_split(key, " "); + if (vec.empty()){ + return srs_error_new(ERROR_GB28181_SIP_PRASE_FAILED, "prase xml"); + } + key = vec.at(0); /*xml element to map @@ -378,6 +382,10 @@ srs_error_t SrsSipStack::parse_xml(std::string xml_msg, std::map get DeviceList std::vector vec = srs_string_split(key, " "); + if (vec.empty()){ + return srs_error_new(ERROR_GB28181_SIP_PRASE_FAILED, "prase xml"); + } + key = vec.at(0); //key to map by xml_layer @@ -411,7 +419,13 @@ srs_error_t SrsSipStack::do_parse_request(SrsSipRequest* req, const char* recv_m srs_error_t err = srs_success; std::vector header_body = srs_string_split(recv_msg, SRS_RTSP_CRLFCRLF); + if (header_body.empty()){ + return srs_error_new(ERROR_GB28181_SIP_PRASE_FAILED, "parse reques message"); + } + std::string header = header_body.at(0); + //Must be added SRS_RTSP_CRLFCRLF in order to handle the last line header + header += SRS_RTSP_CRLFCRLF; std::string body = ""; if (header_body.size() > 1){ @@ -435,7 +449,7 @@ srs_error_t SrsSipStack::do_parse_request(SrsSipRequest* req, const char* recv_m newline_start = p; if (firstline == ""){ - firstline = oneline; + firstline = srs_string_replace(oneline, "\r\n", ""); srs_info("sip: first line=%s", firstline.c_str()); }else{ size_t pos = oneline.find(":"); @@ -450,7 +464,7 @@ srs_error_t SrsSipStack::do_parse_request(SrsSipRequest* req, const char* recv_m if (!strcasecmp(phead, "call-id:")) { std::vector vec_callid = srs_string_split(content, " "); - req->call_id = vec_callid.at(0); + req->call_id = vec_callid.empty() ? "" : vec_callid.at(0); } else if (!strcasecmp(phead, "contact:")) { req->contact = content; @@ -466,8 +480,9 @@ srs_error_t SrsSipStack::do_parse_request(SrsSipRequest* req, const char* recv_m } else if (!strcasecmp(phead, "cseq:")) { std::vector vec_seq = srs_string_split(content, " "); - req->seq = strtoul(vec_seq.at(0).c_str(), NULL, 10); - req->method = vec_seq.at(1); + std::string seq = vec_seq.empty() ? "" : vec_seq.at(0); + req->seq = strtoul(seq.c_str(), NULL, 10); + req->method = vec_seq.size() > 0 ? vec_seq.at(1) : ""; } else if (!strcasecmp(phead, "from:")) { content = srs_string_replace(content, "sip:", ""); @@ -484,7 +499,6 @@ srs_error_t SrsSipStack::do_parse_request(SrsSipRequest* req, const char* recv_m } } else if (!strcasecmp(phead, "via:")) { - //std::vector vec_via = srs_string_split(content, ";"); req->via = content; req->branch = srs_sip_get_param(content.c_str(), "branch"); } @@ -516,25 +530,32 @@ srs_error_t SrsSipStack::do_parse_request(SrsSipRequest* req, const char* recv_m } std::vector method_uri_ver = srs_string_split(firstline, " "); + + if (method_uri_ver.empty()) { + return srs_error_new(ERROR_GB28181_SIP_PRASE_FAILED, "parse request firstline is empty"); + } + //respone first line text:SIP/2.0 200 OK if (!strcasecmp(method_uri_ver.at(0).c_str(), "sip/2.0")) { req->cmdtype = SrsSipCmdRespone; //req->method= vec_seq.at(1); - req->status = method_uri_ver.at(1); + req->status = method_uri_ver.size() > 0 ? method_uri_ver.at(1) : ""; req->version = method_uri_ver.at(0); req->uri = req->from; vector str = srs_string_split(req->to, "@"); - req->sip_auth_id = srs_string_replace(str.at(0), "sip:", ""); + std::string ss = str.empty() ? "" : str.at(0); + req->sip_auth_id = srs_string_replace(ss, "sip:", ""); }else {//request first line text :MESSAGE sip:34020000002000000001@3402000000 SIP/2.0 req->cmdtype = SrsSipCmdRequest; req->method= method_uri_ver.at(0); - req->uri = method_uri_ver.at(1); - req->version = method_uri_ver.at(2); + req->uri = method_uri_ver.size() > 0 ? method_uri_ver.at(1) : ""; + req->version = method_uri_ver.size() > 1 ? method_uri_ver.at(2) : ""; vector str = srs_string_split(req->from, "@"); - req->sip_auth_id = srs_string_replace(str.at(0), "sip:", ""); + std::string ss = str.empty() ? "" : str.at(0); + req->sip_auth_id = srs_string_replace(ss, "sip:", ""); } req->sip_username = req->sip_auth_id; @@ -625,8 +646,12 @@ std::string SrsSipStack::get_sip_via(SrsSipRequest const *req) { std::string via = srs_string_replace(req->via, SRS_SIP_VERSION"/UDP ", ""); std::vector vec_via = srs_string_split(via, ";"); - std::string ip_port = vec_via.at(0); + + std::string ip_port = vec_via.empty() ? "" : vec_via.at(0); std::vector vec_ip_port = srs_string_split(ip_port, ":"); + + std::string ip = vec_ip_port.empty() ? "" : vec_ip_port.at(0); + std::string port = vec_ip_port.size() > 0 ? vec_ip_port.at(1) : ""; std::string branch, rport, received; if (req->branch.empty()){ @@ -635,8 +660,8 @@ std::string SrsSipStack::get_sip_via(SrsSipRequest const *req) branch = ";branch=" + req->branch; } - received = ";received=" + vec_ip_port.at(0); - rport = ";rport=" + vec_ip_port.at(1); + received = ";received=" + ip; + rport = ";rport=" + port; return SRS_SIP_VERSION"/UDP " + ip_port + rport + received + branch; }