|
@@ -1095,8 +1095,10 @@ static int process_sdp(struct sk_buff *skb, unsigned int protoff,
|
|
|
port = simple_strtoul(*dptr + mediaoff, NULL, 10);
|
|
|
if (port == 0)
|
|
|
continue;
|
|
|
- if (port < 1024 || port > 65535)
|
|
|
+ if (port < 1024 || port > 65535) {
|
|
|
+ nf_ct_helper_log(skb, ct, "wrong port %u", port);
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
|
|
|
/* The media description overrides the session description. */
|
|
|
maddr_len = 0;
|
|
@@ -1107,15 +1109,20 @@ static int process_sdp(struct sk_buff *skb, unsigned int protoff,
|
|
|
memcpy(&rtp_addr, &maddr, sizeof(rtp_addr));
|
|
|
} else if (caddr_len)
|
|
|
memcpy(&rtp_addr, &caddr, sizeof(rtp_addr));
|
|
|
- else
|
|
|
+ else {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot parse SDP message");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
|
|
|
ret = set_expected_rtp_rtcp(skb, protoff, dataoff,
|
|
|
dptr, datalen,
|
|
|
&rtp_addr, htons(port), t->class,
|
|
|
mediaoff, medialen);
|
|
|
- if (ret != NF_ACCEPT)
|
|
|
+ if (ret != NF_ACCEPT) {
|
|
|
+ nf_ct_helper_log(skb, ct,
|
|
|
+ "cannot add expectation for voice");
|
|
|
return ret;
|
|
|
+ }
|
|
|
|
|
|
/* Update media connection address if present */
|
|
|
if (maddr_len && nf_nat_sdp_addr && ct->status & IPS_NAT_MASK) {
|
|
@@ -1123,8 +1130,10 @@ static int process_sdp(struct sk_buff *skb, unsigned int protoff,
|
|
|
dptr, datalen, mediaoff,
|
|
|
SDP_HDR_CONNECTION, SDP_HDR_MEDIA,
|
|
|
&rtp_addr);
|
|
|
- if (ret != NF_ACCEPT)
|
|
|
+ if (ret != NF_ACCEPT) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot mangle SDP");
|
|
|
return ret;
|
|
|
+ }
|
|
|
}
|
|
|
i++;
|
|
|
}
|
|
@@ -1258,9 +1267,10 @@ static int process_register_request(struct sk_buff *skb, unsigned int protoff,
|
|
|
ret = ct_sip_parse_header_uri(ct, *dptr, NULL, *datalen,
|
|
|
SIP_HDR_CONTACT, NULL,
|
|
|
&matchoff, &matchlen, &daddr, &port);
|
|
|
- if (ret < 0)
|
|
|
+ if (ret < 0) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot parse contact");
|
|
|
return NF_DROP;
|
|
|
- else if (ret == 0)
|
|
|
+ } else if (ret == 0)
|
|
|
return NF_ACCEPT;
|
|
|
|
|
|
/* We don't support third-party registrations */
|
|
@@ -1273,8 +1283,10 @@ static int process_register_request(struct sk_buff *skb, unsigned int protoff,
|
|
|
|
|
|
if (ct_sip_parse_numerical_param(ct, *dptr,
|
|
|
matchoff + matchlen, *datalen,
|
|
|
- "expires=", NULL, NULL, &expires) < 0)
|
|
|
+ "expires=", NULL, NULL, &expires) < 0) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot parse expires");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
|
|
|
if (expires == 0) {
|
|
|
ret = NF_ACCEPT;
|
|
@@ -1282,8 +1294,10 @@ static int process_register_request(struct sk_buff *skb, unsigned int protoff,
|
|
|
}
|
|
|
|
|
|
exp = nf_ct_expect_alloc(ct);
|
|
|
- if (!exp)
|
|
|
+ if (!exp) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot alloc expectation");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
|
|
|
saddr = NULL;
|
|
|
if (sip_direct_signalling)
|
|
@@ -1300,9 +1314,10 @@ static int process_register_request(struct sk_buff *skb, unsigned int protoff,
|
|
|
ret = nf_nat_sip_expect(skb, protoff, dataoff, dptr, datalen,
|
|
|
exp, matchoff, matchlen);
|
|
|
else {
|
|
|
- if (nf_ct_expect_related(exp) != 0)
|
|
|
+ if (nf_ct_expect_related(exp) != 0) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot add expectation");
|
|
|
ret = NF_DROP;
|
|
|
- else
|
|
|
+ } else
|
|
|
ret = NF_ACCEPT;
|
|
|
}
|
|
|
nf_ct_expect_put(exp);
|
|
@@ -1356,9 +1371,10 @@ static int process_register_response(struct sk_buff *skb, unsigned int protoff,
|
|
|
SIP_HDR_CONTACT, &in_contact,
|
|
|
&matchoff, &matchlen,
|
|
|
&addr, &port);
|
|
|
- if (ret < 0)
|
|
|
+ if (ret < 0) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot parse contact");
|
|
|
return NF_DROP;
|
|
|
- else if (ret == 0)
|
|
|
+ } else if (ret == 0)
|
|
|
break;
|
|
|
|
|
|
/* We don't support third-party registrations */
|
|
@@ -1373,8 +1389,10 @@ static int process_register_response(struct sk_buff *skb, unsigned int protoff,
|
|
|
matchoff + matchlen,
|
|
|
*datalen, "expires=",
|
|
|
NULL, NULL, &c_expires);
|
|
|
- if (ret < 0)
|
|
|
+ if (ret < 0) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot parse expires");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
if (c_expires == 0)
|
|
|
break;
|
|
|
if (refresh_signalling_expectation(ct, &addr, proto, port,
|
|
@@ -1408,15 +1426,21 @@ static int process_sip_response(struct sk_buff *skb, unsigned int protoff,
|
|
|
if (*datalen < strlen("SIP/2.0 200"))
|
|
|
return NF_ACCEPT;
|
|
|
code = simple_strtoul(*dptr + strlen("SIP/2.0 "), NULL, 10);
|
|
|
- if (!code)
|
|
|
+ if (!code) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot get code");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
|
|
|
if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CSEQ,
|
|
|
- &matchoff, &matchlen) <= 0)
|
|
|
+ &matchoff, &matchlen) <= 0) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot parse cseq");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
cseq = simple_strtoul(*dptr + matchoff, NULL, 10);
|
|
|
- if (!cseq)
|
|
|
+ if (!cseq) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot get cseq");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
matchend = matchoff + matchlen + 1;
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(sip_handlers); i++) {
|
|
@@ -1471,11 +1495,15 @@ static int process_sip_request(struct sk_buff *skb, unsigned int protoff,
|
|
|
continue;
|
|
|
|
|
|
if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CSEQ,
|
|
|
- &matchoff, &matchlen) <= 0)
|
|
|
+ &matchoff, &matchlen) <= 0) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot parse cseq");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
cseq = simple_strtoul(*dptr + matchoff, NULL, 10);
|
|
|
- if (!cseq)
|
|
|
+ if (!cseq) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot get cseq");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
|
|
|
return handler->request(skb, protoff, dataoff, dptr, datalen,
|
|
|
cseq);
|
|
@@ -1498,8 +1526,10 @@ static int process_sip_msg(struct sk_buff *skb, struct nf_conn *ct,
|
|
|
if (ret == NF_ACCEPT && ct->status & IPS_NAT_MASK) {
|
|
|
nf_nat_sip = rcu_dereference(nf_nat_sip_hook);
|
|
|
if (nf_nat_sip && !nf_nat_sip(skb, protoff, dataoff,
|
|
|
- dptr, datalen))
|
|
|
+ dptr, datalen)) {
|
|
|
+ nf_ct_helper_log(skb, ct, "cannot NAT SIP message");
|
|
|
ret = NF_DROP;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
@@ -1563,11 +1593,14 @@ static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff,
|
|
|
end += strlen("\r\n\r\n") + clen;
|
|
|
|
|
|
msglen = origlen = end - dptr;
|
|
|
- if (msglen > datalen)
|
|
|
+ if (msglen > datalen) {
|
|
|
+ nf_ct_helper_log(skb, ct, "incomplete/bad SIP message");
|
|
|
return NF_DROP;
|
|
|
+ }
|
|
|
|
|
|
ret = process_sip_msg(skb, ct, protoff, dataoff,
|
|
|
&dptr, &msglen);
|
|
|
+ /* process_sip_* functions report why this packet is dropped */
|
|
|
if (ret != NF_ACCEPT)
|
|
|
break;
|
|
|
diff = msglen - origlen;
|