Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2014
477
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  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);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement