aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/netfilter/xt_dccp.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/net/netfilter/xt_dccp.c b/net/netfilter/xt_dccp.c
index e5d3e8673287..0989f29ade2e 100644
--- a/net/netfilter/xt_dccp.c
+++ b/net/netfilter/xt_dccp.c
@@ -45,10 +45,8 @@ dccp_find_option(u_int8_t option,
45 unsigned int optlen = dh->dccph_doff*4 - __dccp_hdr_len(dh); 45 unsigned int optlen = dh->dccph_doff*4 - __dccp_hdr_len(dh);
46 unsigned int i; 46 unsigned int i;
47 47
48 if (dh->dccph_doff * 4 < __dccp_hdr_len(dh)) { 48 if (dh->dccph_doff * 4 < __dccp_hdr_len(dh))
49 *hotdrop = true; 49 goto invalid;
50 return false;
51 }
52 50
53 if (!optlen) 51 if (!optlen)
54 return false; 52 return false;
@@ -57,9 +55,7 @@ dccp_find_option(u_int8_t option,
57 op = skb_header_pointer(skb, protoff + optoff, optlen, dccp_optbuf); 55 op = skb_header_pointer(skb, protoff + optoff, optlen, dccp_optbuf);
58 if (op == NULL) { 56 if (op == NULL) {
59 /* If we don't have the whole header, drop packet. */ 57 /* If we don't have the whole header, drop packet. */
60 spin_unlock_bh(&dccp_buflock); 58 goto partial;
61 *hotdrop = true;
62 return false;
63 } 59 }
64 60
65 for (i = 0; i < optlen; ) { 61 for (i = 0; i < optlen; ) {
@@ -76,6 +72,12 @@ dccp_find_option(u_int8_t option,
76 72
77 spin_unlock_bh(&dccp_buflock); 73 spin_unlock_bh(&dccp_buflock);
78 return false; 74 return false;
75
76partial:
77 spin_unlock_bh(&dccp_buflock);
78invalid:
79 *hotdrop = true;
80 return false;
79} 81}
80 82
81 83