SHARE
TWEET

Untitled

a guest Mar 23rd, 2014 125 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff --git a/nf_nat_rtsp.c b/nf_nat_rtsp.c
  2. index 6be8346..3354e7b 100644
  3. --- a/nf_nat_rtsp.c
  4. +++ b/nf_nat_rtsp.c
  5. @@ -82,13 +82,34 @@ MODULE_PARM_DESC(destaction, "Action for destination parameter (auto/strip/none)
  6.  /*** helper functions ***/
  7.  
  8.  static void
  9. -get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen)
  10. +get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen, uint protoff)
  11.  {
  12. -       struct iphdr*   iph  = ip_hdr(skb);
  13. -       struct tcphdr*  tcph = (void *)iph + ip_hdrlen(skb);
  14. +       char* rtsp_buffer;
  15. +       struct tcphdr _tcph, *th;
  16. +       int datalen, dataoff;
  17. +
  18. +       rtsp_buffer = kmalloc(65536, GFP_KERNEL);
  19. +
  20. +        /* Not whole TCP header? */
  21. +        th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
  22. +       if (!th)
  23. +       {
  24. +               *ptcpdatalen = 0;
  25. +               return;
  26. +       }
  27. +        /* No data ? */
  28. +        dataoff = protoff + th->doff*4;
  29. +       if (dataoff >= skb->len)
  30. +       {
  31. +               *ptcpdatalen = 0;
  32. +               return;
  33. +       }
  34. +        datalen = skb->len - dataoff;
  35. +
  36. +       *pptcpdata = skb_header_pointer(skb, dataoff, datalen, rtsp_buffer);
  37. +       *ptcpdatalen = datalen;
  38.  
  39. -       *pptcpdata = (char*)tcph +  tcph->doff*4;
  40. -       *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
  41. +       kfree(rtsp_buffer);
  42.  }
  43.  
  44.  #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
  45. @@ -164,7 +185,7 @@ rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
  46.         uint extaddrlen;
  47.         int  is_stun;
  48.  
  49. -       get_skb_tcpdata(skb, &ptcp, &tcplen);
  50. +       get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
  51.         ptran = ptcp+tranoff;
  52.  
  53.         if (tranoff+tranlen > tcplen || tcplen-tranoff < tranlen ||
  54. @@ -325,7 +346,7 @@ rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
  55.                                                         nf_ct_unexpect_related(rtcp_exp);
  56.                                                 return 0;
  57.                                         }
  58. -                                       get_skb_tcpdata(skb, &ptcp, &tcplen);
  59. +                                       get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
  60.                                         ptran = ptcp+tranoff;
  61.                                         tranlen -= diff;
  62.                                         nextparamoff -= diff;
  63. @@ -395,7 +416,7 @@ rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
  64.                                                         nf_ct_unexpect_related(rtcp_exp);
  65.                                                 return 0;
  66.                                         }
  67. -                                       get_skb_tcpdata(skb, &ptcp, &tcplen);
  68. +                                       get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
  69.                                         ptran = ptcp+tranoff;
  70.                                         tranlen -= diff;
  71.                                         nextparamoff -= diff;
  72. @@ -439,7 +460,7 @@ help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
  73.         //struct iphdr* iph = (struct iphdr*)(*pskb)->nh.iph;
  74.         //struct tcphdr* tcph = (struct tcphdr*)((void*)iph + iph->ihl*4);
  75.  
  76. -       get_skb_tcpdata(skb, &ptcp, &tcplen);
  77. +       get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
  78.         hdrsoff = matchoff;//exp->seq - ntohl(tcph->seq);
  79.         hdrslen = matchlen;
  80.         off = hdrsoff;
  81. @@ -486,7 +507,7 @@ help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
  82.                                 rtcp_exp->saved_proto.udp.port = htons(prtspexp->hiport);
  83.                                 rtcp_exp->dir = !dir;
  84.                         }
  85. -                       get_skb_tcpdata(skb, &ptcp, &tcplen);
  86. +                       get_skb_tcpdata(skb, &ptcp, &tcplen, protoff);
  87.                         hdrslen -= (oldtcplen-tcplen);
  88.                         off -= (oldtcplen-tcplen);
  89.                         lineoff -= (oldtcplen-tcplen);
RAW Paste Data
Challenge yourself this year...
Learn something new in 2017
Top