* [NETFILTER 7/8]: pptp helper: clean up conntrack_pptp_help() a bit
@ 2005-09-15 22:44 Patrick McHardy
0 siblings, 0 replies; only message in thread
From: Patrick McHardy @ 2005-09-15 22:44 UTC (permalink / raw)
To: Harald Welte; +Cc: Netfilter Development Mailinglist, David S. Miller
[-- Attachment #1: 07.diff --]
[-- Type: text/x-patch, Size: 5561 bytes --]
[NETFILTER]: pptp helper: clean up conntrack_pptp_help() a bit
- The tcp header is already fully validated by TCP connection tracking,
no need to redo it
- Remove unused variable datalimit
- move nexthdr_off adjustment next to header parsing, use it where
possible
- also adjust datalen as the packet is parsed instead of calculating
how much was already parsed in later functions
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
commit ac7e4424f98eef582b9923011d27c208252a0096
tree bc92def0c43e47effa8b32a904e598058fc1f302
parent 2834891111a5574444e4af9a6b1fd496a3359f2b
author Patrick McHardy <kaber@trash.net> Fri, 16 Sep 2005 00:18:40 +0200
committer Patrick McHardy <kaber@trash.net> Fri, 16 Sep 2005 00:18:40 +0200
net/ipv4/netfilter/ip_conntrack_helper_pptp.c | 65 ++++++++-----------------
1 files changed, 22 insertions(+), 43 deletions(-)
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_pptp.c b/net/ipv4/netfilter/ip_conntrack_helper_pptp.c
--- a/net/ipv4/netfilter/ip_conntrack_helper_pptp.c
+++ b/net/ipv4/netfilter/ip_conntrack_helper_pptp.c
@@ -311,8 +311,8 @@ out_unexpect_orig:
static inline int
pptp_inbound_pkt(struct sk_buff **pskb,
struct tcphdr *tcph,
- unsigned int ctlhoff,
- size_t datalen,
+ unsigned int nexthdr_off,
+ unsigned int datalen,
struct ip_conntrack *ct,
enum ip_conntrack_info ctinfo)
{
@@ -323,18 +323,19 @@ pptp_inbound_pkt(struct sk_buff **pskb,
u_int16_t msg, *cid, *pcid;
u_int32_t seq;
- ctlh = skb_header_pointer(*pskb, ctlhoff, sizeof(_ctlh), &_ctlh);
- if (unlikely(!ctlh)) {
+ ctlh = skb_header_pointer(*pskb, nexthdr_off, sizeof(_ctlh), &_ctlh);
+ if (!ctlh) {
DEBUGP("error during skb_header_pointer\n");
return NF_ACCEPT;
}
+ nexthdr_off += sizeof(_ctlh);
+ datalen -= sizeof(_ctlh);
- reqlen = datalen - sizeof(struct pptp_pkt_hdr) - sizeof(_ctlh);
+ reqlen = datalen;
if (reqlen > sizeof(*pptpReq))
reqlen = sizeof(*pptpReq);
- pptpReq = skb_header_pointer(*pskb, ctlhoff+sizeof(_ctlh),
- reqlen, &_pptpReq);
- if (unlikely(!pptpReq)) {
+ pptpReq = skb_header_pointer(*pskb, nexthdr_off, reqlen, &_pptpReq);
+ if (!pptpReq) {
DEBUGP("error during skb_header_pointer\n");
return NF_ACCEPT;
}
@@ -521,8 +522,8 @@ pptp_inbound_pkt(struct sk_buff **pskb,
static inline int
pptp_outbound_pkt(struct sk_buff **pskb,
struct tcphdr *tcph,
- unsigned int ctlhoff,
- size_t datalen,
+ unsigned int nexthdr_off,
+ unsigned int datalen,
struct ip_conntrack *ct,
enum ip_conntrack_info ctinfo)
{
@@ -532,15 +533,16 @@ pptp_outbound_pkt(struct sk_buff **pskb,
struct ip_ct_pptp_master *info = &ct->help.ct_pptp_info;
u_int16_t msg, *cid, *pcid;
- ctlh = skb_header_pointer(*pskb, ctlhoff, sizeof(_ctlh), &_ctlh);
+ ctlh = skb_header_pointer(*pskb, nexthdr_off, sizeof(_ctlh), &_ctlh);
if (!ctlh)
return NF_ACCEPT;
+ nexthdr_off += sizeof(_ctlh);
+ datalen -= sizeof(_ctlh);
- reqlen = datalen - sizeof(struct pptp_pkt_hdr) - sizeof(_ctlh);
+ reqlen = datalen;
if (reqlen > sizeof(*pptpReq))
reqlen = sizeof(*pptpReq);
- pptpReq = skb_header_pointer(*pskb, ctlhoff+sizeof(_ctlh), reqlen,
- &_pptpReq);
+ pptpReq = skb_header_pointer(*pskb, nexthdr_off, reqlen, &_pptpReq);
if (!pptpReq)
return NF_ACCEPT;
@@ -647,11 +649,9 @@ conntrack_pptp_help(struct sk_buff **psk
{
struct pptp_pkt_hdr _pptph, *pptph;
-
struct tcphdr _tcph, *tcph;
u_int32_t tcplen = (*pskb)->len - (*pskb)->nh.iph->ihl * 4;
u_int32_t datalen;
- void *datalimit;
int dir = CTINFO2DIR(ctinfo);
struct ip_ct_pptp_master *info = &ct->help.ct_pptp_info;
unsigned int nexthdr_off;
@@ -667,29 +667,11 @@ conntrack_pptp_help(struct sk_buff **psk
}
nexthdr_off = (*pskb)->nh.iph->ihl*4;
- tcph = skb_header_pointer(*pskb, (*pskb)->nh.iph->ihl*4, sizeof(_tcph),
- &_tcph);
- if (!tcph)
- return NF_ACCEPT;
-
- /* not a complete TCP header? */
- if (tcplen < sizeof(struct tcphdr) || tcplen < tcph->doff * 4) {
- DEBUGP("tcplen = %u\n", tcplen);
- return NF_ACCEPT;
- }
-
-
+ tcph = skb_header_pointer(*pskb, nexthdr_off, sizeof(_tcph), &_tcph);
+ BUG_ON(!tcph);
+ nexthdr_off += tcph->doff * 4;
datalen = tcplen - tcph->doff * 4;
- /* checksum invalid? */
- if (tcp_v4_check(tcph, tcplen, (*pskb)->nh.iph->saddr,
- (*pskb)->nh.iph->daddr,
- csum_partial((char *) tcph, tcplen, 0))) {
- DEBUGP(" bad csum\n");
- /* W2K PPTP server sends TCP packets with wrong checksum :(( */
- /* return NF_ACCEPT */
- }
-
if (tcph->fin || tcph->rst) {
DEBUGP("RST/FIN received, timeouting GRE\n");
/* can't do this after real newnat */
@@ -699,15 +681,13 @@ conntrack_pptp_help(struct sk_buff **psk
pptp_timeout_related(ct);
}
- nexthdr_off += tcph->doff*4;
- pptph = skb_header_pointer(*pskb, (*pskb)->nh.iph->ihl*4 + tcph->doff*4,
- sizeof(_pptph), &_pptph);
+ pptph = skb_header_pointer(*pskb, nexthdr_off, sizeof(_pptph), &_pptph);
if (!pptph) {
DEBUGP("no full PPTP header, can't track\n");
return NF_ACCEPT;
}
-
- datalimit = (void *) pptph + datalen;
+ nexthdr_off += sizeof(_pptph);
+ datalen -= sizeof(_pptph);
/* if it's not a control message we can't do anything with it */
if (ntohs(pptph->packetType) != PPTP_PACKET_CONTROL ||
@@ -721,7 +701,6 @@ conntrack_pptp_help(struct sk_buff **psk
spin_lock_bh(&ip_pptp_lock);
- nexthdr_off += sizeof(_pptph);
/* FIXME: We just blindly assume that the control connection is always
* established from PNS->PAC. However, RFC makes no guarantee */
if (dir == IP_CT_DIR_ORIGINAL)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-09-15 22:44 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-15 22:44 [NETFILTER 7/8]: pptp helper: clean up conntrack_pptp_help() a bit Patrick McHardy
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.