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..bc60b71 100644
- --- a/nf_nat_rtsp.c
- +++ b/nf_nat_rtsp.c
- @@ -67,6 +67,8 @@ static char* destaction = NULL;
- static u_int32_t extip = 0;
- static int dstact = 0;
- +static char *rtsp_buffer;
- +
- static void nf_nat_rtsp_expected(struct nf_conn* ct, struct nf_conntrack_expect *exp);
- MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
- @@ -82,13 +84,29 @@ 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);
- + struct tcphdr _tcph, *th;
- + int datalen, dataoff;
- +
- + /* 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 = (char*)tcph + tcph->doff*4;
- - *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
- + *pptcpdata = skb_header_pointer(skb, dataoff, datalen, rtsp_buffer);
- + *ptcpdatalen = datalen;
- }
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
- @@ -164,7 +182,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 +343,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 +413,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 +457,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 +504,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);
- @@ -587,6 +605,7 @@ static void __exit fini(void)
- {
- rcu_assign_pointer(nf_nat_rtsp_hook, NULL);
- synchronize_net();
- + kfree(rtsp_buffer);
- }
- static int __init init(void)
- @@ -610,6 +629,10 @@ static int __init init(void)
- dstact = DSTACT_NONE;
- }
- + rtsp_buffer = kmalloc(65536, GFP_KERNEL);
- + if (!rtsp_buffer)
- + return -ENOMEM;
- +
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement