aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2008-03-25 23:18:57 -0400
committerDavid S. Miller <davem@davemloft.net>2008-03-25 23:18:57 -0400
commitea45f12a2766dae54e5426a23e8f4bafdbe2782e (patch)
treeeb3096bee1e0053c545424f9cea5d0c91b114fe4 /net/ipv4
parentac3677406d4e36e86b1eb5a453997a3b3e0c089a (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')
-rw-r--r--net/ipv4/netfilter/nf_nat_sip.c18
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
109static int map_sip_addr(struct sk_buff *skb, 109static 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);