Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/nf_nat_rtsp.c b/nf_nat_rtsp.c
- index 6be8346..3354e7b 100644
- --- a/nf_nat_rtsp.c
- +++ b/nf_nat_rtsp.c
- @@ -82,13 +82,34 @@ MODULE_PARM_DESC(destaction, "Action for destination parameter (auto/strip/none)
- /*** helper functions ***/
- static void
- -get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen)
- +get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen, uint protoff)
- {
- - struct iphdr* iph = ip_hdr(skb);
- - struct tcphdr* tcph = (void *)iph + ip_hdrlen(skb);
- + char* rtsp_buffer;
- + struct tcphdr _tcph, *th;
- + int datalen, dataoff;
- +
- + rtsp_buffer = kmalloc(65536, GFP_KERNEL);
- +
- + /* Not whole TCP header? */
- + th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
- + if (!th)
- + {
- + *ptcpdatalen = 0;
- + return;
- + }
- + /* No data ? */
- + dataoff = protoff + th->doff*4;
- + if (dataoff >= skb->len)
- + {
- + *ptcpdatalen = 0;
- + return;
- + }
- + datalen = skb->len - dataoff;
- +
- + *pptcpdata = skb_header_pointer(skb, dataoff, datalen, rtsp_buffer);
- + *ptcpdatalen = datalen;
- - *pptcpdata = (char*)tcph + tcph->doff*4;
- - *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
- + kfree(rtsp_buffer);
- }
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
- @@ -164,7 +185,7 @@ rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
- uint extaddrlen;
- int is_stun;
- - get_skb_tcpdata(skb, &ptcp, &tcplen);
- + get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
- ptran = ptcp+tranoff;
- if (tranoff+tranlen > tcplen || tcplen-tranoff < tranlen ||
- @@ -325,7 +346,7 @@ rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
- nf_ct_unexpect_related(rtcp_exp);
- return 0;
- }
- - get_skb_tcpdata(skb, &ptcp, &tcplen);
- + get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
- ptran = ptcp+tranoff;
- tranlen -= diff;
- nextparamoff -= diff;
- @@ -395,7 +416,7 @@ rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
- nf_ct_unexpect_related(rtcp_exp);
- return 0;
- }
- - get_skb_tcpdata(skb, &ptcp, &tcplen);
- + get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
- ptran = ptcp+tranoff;
- tranlen -= diff;
- nextparamoff -= diff;
- @@ -439,7 +460,7 @@ help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
- //struct iphdr* iph = (struct iphdr*)(*pskb)->nh.iph;
- //struct tcphdr* tcph = (struct tcphdr*)((void*)iph + iph->ihl*4);
- - get_skb_tcpdata(skb, &ptcp, &tcplen);
- + get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
- hdrsoff = matchoff;//exp->seq - ntohl(tcph->seq);
- hdrslen = matchlen;
- off = hdrsoff;
- @@ -486,7 +507,7 @@ help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
- rtcp_exp->saved_proto.udp.port = htons(prtspexp->hiport);
- rtcp_exp->dir = !dir;
- }
- - get_skb_tcpdata(skb, &ptcp, &tcplen);
- + get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
- hdrslen -= (oldtcplen-tcplen);
- off -= (oldtcplen-tcplen);
- lineoff -= (oldtcplen-tcplen);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement