diff options
author | Patrick McHardy <kaber@trash.net> | 2008-03-25 23:18:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-03-25 23:18:57 -0400 |
commit | ea45f12a2766dae54e5426a23e8f4bafdbe2782e (patch) | |
tree | eb3096bee1e0053c545424f9cea5d0c91b114fe4 /net/ipv4/netfilter/nf_nat_sip.c | |
parent | ac3677406d4e36e86b1eb5a453997a3b3e0c089a (diff) |
[NETFILTER]: nf_conntrack_sip: parse SIP headers properly
Introduce new function for SIP header parsing that properly deals with
continuation lines and whitespace in headers and use it.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/netfilter/nf_nat_sip.c')
-rw-r--r-- | net/ipv4/netfilter/nf_nat_sip.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/net/ipv4/netfilter/nf_nat_sip.c b/net/ipv4/netfilter/nf_nat_sip.c index 60151b5901a..c13e4386236 100644 --- a/net/ipv4/netfilter/nf_nat_sip.c +++ b/net/ipv4/netfilter/nf_nat_sip.c | |||
@@ -108,14 +108,14 @@ static int map_addr(struct sk_buff *skb, | |||
108 | 108 | ||
109 | static int map_sip_addr(struct sk_buff *skb, | 109 | static int map_sip_addr(struct sk_buff *skb, |
110 | const char **dptr, unsigned int *datalen, | 110 | const char **dptr, unsigned int *datalen, |
111 | enum sip_header_pos pos, struct addr_map *map) | 111 | enum sip_header_types type, struct addr_map *map) |
112 | { | 112 | { |
113 | enum ip_conntrack_info ctinfo; | 113 | enum ip_conntrack_info ctinfo; |
114 | struct nf_conn *ct = nf_ct_get(skb, &ctinfo); | 114 | struct nf_conn *ct = nf_ct_get(skb, &ctinfo); |
115 | unsigned int matchlen, matchoff; | 115 | unsigned int matchlen, matchoff; |
116 | 116 | ||
117 | if (ct_sip_get_info(ct, *dptr, *datalen, &matchoff, &matchlen, | 117 | if (ct_sip_get_header(ct, *dptr, 0, *datalen, type, |
118 | pos) <= 0) | 118 | &matchoff, &matchlen) <= 0) |
119 | return 1; | 119 | return 1; |
120 | return map_addr(skb, dptr, datalen, matchoff, matchlen, map); | 120 | return map_addr(skb, dptr, datalen, matchoff, matchlen, map); |
121 | } | 121 | } |
@@ -141,10 +141,10 @@ static unsigned int ip_nat_sip(struct sk_buff *skb, | |||
141 | return NF_DROP; | 141 | return NF_DROP; |
142 | } | 142 | } |
143 | 143 | ||
144 | if (!map_sip_addr(skb, dptr, datalen, POS_FROM, &map) || | 144 | if (!map_sip_addr(skb, dptr, datalen, SIP_HDR_FROM, &map) || |
145 | !map_sip_addr(skb, dptr, datalen, POS_TO, &map) || | 145 | !map_sip_addr(skb, dptr, datalen, SIP_HDR_TO, &map) || |
146 | !map_sip_addr(skb, dptr, datalen, POS_VIA, &map) || | 146 | !map_sip_addr(skb, dptr, datalen, SIP_HDR_VIA, &map) || |
147 | !map_sip_addr(skb, dptr, datalen, POS_CONTACT, &map)) | 147 | !map_sip_addr(skb, dptr, datalen, SIP_HDR_CONTACT, &map)) |
148 | return NF_DROP; | 148 | return NF_DROP; |
149 | return NF_ACCEPT; | 149 | return NF_ACCEPT; |
150 | } | 150 | } |
@@ -166,8 +166,8 @@ static int mangle_content_len(struct sk_buff *skb, | |||
166 | c_len = *datalen - matchoff + strlen("v="); | 166 | c_len = *datalen - matchoff + strlen("v="); |
167 | 167 | ||
168 | /* Now, update SDP length */ | 168 | /* Now, update SDP length */ |
169 | if (ct_sip_get_info(ct, *dptr, *datalen, &matchoff, &matchlen, | 169 | if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CONTENT_LENGTH, |
170 | POS_CONTENT) <= 0) | 170 | &matchoff, &matchlen) <= 0) |
171 | return 0; | 171 | return 0; |
172 | 172 | ||
173 | buflen = sprintf(buffer, "%u", c_len); | 173 | buflen = sprintf(buffer, "%u", c_len); |