diff options
-rw-r--r-- | include/linux/netfilter/xt_sctp.h | 13 | ||||
-rw-r--r-- | net/netfilter/xt_sctp.c | 18 |
2 files changed, 13 insertions, 18 deletions
diff --git a/include/linux/netfilter/xt_sctp.h b/include/linux/netfilter/xt_sctp.h index b157897e7792..dd5a4fd4cfd3 100644 --- a/include/linux/netfilter/xt_sctp.h +++ b/include/linux/netfilter/xt_sctp.h | |||
@@ -7,9 +7,6 @@ | |||
7 | 7 | ||
8 | #define XT_SCTP_VALID_FLAGS 0x07 | 8 | #define XT_SCTP_VALID_FLAGS 0x07 |
9 | 9 | ||
10 | #define ELEMCOUNT(x) (sizeof(x)/sizeof(x[0])) | ||
11 | |||
12 | |||
13 | struct xt_sctp_flag_info { | 10 | struct xt_sctp_flag_info { |
14 | u_int8_t chunktype; | 11 | u_int8_t chunktype; |
15 | u_int8_t flag; | 12 | u_int8_t flag; |
@@ -59,21 +56,21 @@ struct xt_sctp_info { | |||
59 | #define SCTP_CHUNKMAP_RESET(chunkmap) \ | 56 | #define SCTP_CHUNKMAP_RESET(chunkmap) \ |
60 | do { \ | 57 | do { \ |
61 | int i; \ | 58 | int i; \ |
62 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 59 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \ |
63 | chunkmap[i] = 0; \ | 60 | chunkmap[i] = 0; \ |
64 | } while (0) | 61 | } while (0) |
65 | 62 | ||
66 | #define SCTP_CHUNKMAP_SET_ALL(chunkmap) \ | 63 | #define SCTP_CHUNKMAP_SET_ALL(chunkmap) \ |
67 | do { \ | 64 | do { \ |
68 | int i; \ | 65 | int i; \ |
69 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 66 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \ |
70 | chunkmap[i] = ~0; \ | 67 | chunkmap[i] = ~0; \ |
71 | } while (0) | 68 | } while (0) |
72 | 69 | ||
73 | #define SCTP_CHUNKMAP_COPY(destmap, srcmap) \ | 70 | #define SCTP_CHUNKMAP_COPY(destmap, srcmap) \ |
74 | do { \ | 71 | do { \ |
75 | int i; \ | 72 | int i; \ |
76 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 73 | for (i = 0; i < ARRAY_SIZE(srcmap); i++) \ |
77 | destmap[i] = srcmap[i]; \ | 74 | destmap[i] = srcmap[i]; \ |
78 | } while (0) | 75 | } while (0) |
79 | 76 | ||
@@ -81,7 +78,7 @@ struct xt_sctp_info { | |||
81 | ({ \ | 78 | ({ \ |
82 | int i; \ | 79 | int i; \ |
83 | int flag = 1; \ | 80 | int flag = 1; \ |
84 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) { \ | 81 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \ |
85 | if (chunkmap[i]) { \ | 82 | if (chunkmap[i]) { \ |
86 | flag = 0; \ | 83 | flag = 0; \ |
87 | break; \ | 84 | break; \ |
@@ -94,7 +91,7 @@ struct xt_sctp_info { | |||
94 | ({ \ | 91 | ({ \ |
95 | int i; \ | 92 | int i; \ |
96 | int flag = 1; \ | 93 | int flag = 1; \ |
97 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) { \ | 94 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \ |
98 | if (chunkmap[i] != ~0) { \ | 95 | if (chunkmap[i] != ~0) { \ |
99 | flag = 0; \ | 96 | flag = 0; \ |
100 | break; \ | 97 | break; \ |
diff --git a/net/netfilter/xt_sctp.c b/net/netfilter/xt_sctp.c index f907770fd4e9..3358273a47b7 100644 --- a/net/netfilter/xt_sctp.c +++ b/net/netfilter/xt_sctp.c | |||
@@ -42,21 +42,21 @@ match_flags(const struct xt_sctp_flag_info *flag_info, | |||
42 | static inline bool | 42 | static inline bool |
43 | match_packet(const struct sk_buff *skb, | 43 | match_packet(const struct sk_buff *skb, |
44 | unsigned int offset, | 44 | unsigned int offset, |
45 | const u_int32_t *chunkmap, | 45 | const struct xt_sctp_info *info, |
46 | int chunk_match_type, | ||
47 | const struct xt_sctp_flag_info *flag_info, | ||
48 | const int flag_count, | ||
49 | bool *hotdrop) | 46 | bool *hotdrop) |
50 | { | 47 | { |
51 | u_int32_t chunkmapcopy[256 / sizeof (u_int32_t)]; | 48 | u_int32_t chunkmapcopy[256 / sizeof (u_int32_t)]; |
52 | sctp_chunkhdr_t _sch, *sch; | 49 | sctp_chunkhdr_t _sch, *sch; |
50 | int chunk_match_type = info->chunk_match_type; | ||
51 | const struct xt_sctp_flag_info *flag_info = info->flag_info; | ||
52 | int flag_count = info->flag_count; | ||
53 | 53 | ||
54 | #ifdef DEBUG_SCTP | 54 | #ifdef DEBUG_SCTP |
55 | int i = 0; | 55 | int i = 0; |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | if (chunk_match_type == SCTP_CHUNK_MATCH_ALL) | 58 | if (chunk_match_type == SCTP_CHUNK_MATCH_ALL) |
59 | SCTP_CHUNKMAP_COPY(chunkmapcopy, chunkmap); | 59 | SCTP_CHUNKMAP_COPY(chunkmapcopy, info->chunkmap); |
60 | 60 | ||
61 | do { | 61 | do { |
62 | sch = skb_header_pointer(skb, offset, sizeof(_sch), &_sch); | 62 | sch = skb_header_pointer(skb, offset, sizeof(_sch), &_sch); |
@@ -73,7 +73,7 @@ match_packet(const struct sk_buff *skb, | |||
73 | 73 | ||
74 | duprintf("skb->len: %d\toffset: %d\n", skb->len, offset); | 74 | duprintf("skb->len: %d\toffset: %d\n", skb->len, offset); |
75 | 75 | ||
76 | if (SCTP_CHUNKMAP_IS_SET(chunkmap, sch->type)) { | 76 | if (SCTP_CHUNKMAP_IS_SET(info->chunkmap, sch->type)) { |
77 | switch (chunk_match_type) { | 77 | switch (chunk_match_type) { |
78 | case SCTP_CHUNK_MATCH_ANY: | 78 | case SCTP_CHUNK_MATCH_ANY: |
79 | if (match_flags(flag_info, flag_count, | 79 | if (match_flags(flag_info, flag_count, |
@@ -104,7 +104,7 @@ match_packet(const struct sk_buff *skb, | |||
104 | 104 | ||
105 | switch (chunk_match_type) { | 105 | switch (chunk_match_type) { |
106 | case SCTP_CHUNK_MATCH_ALL: | 106 | case SCTP_CHUNK_MATCH_ALL: |
107 | return SCTP_CHUNKMAP_IS_CLEAR(chunkmap); | 107 | return SCTP_CHUNKMAP_IS_CLEAR(info->chunkmap); |
108 | case SCTP_CHUNK_MATCH_ANY: | 108 | case SCTP_CHUNK_MATCH_ANY: |
109 | return false; | 109 | return false; |
110 | case SCTP_CHUNK_MATCH_ONLY: | 110 | case SCTP_CHUNK_MATCH_ONLY: |
@@ -148,9 +148,7 @@ match(const struct sk_buff *skb, | |||
148 | && ntohs(sh->dest) <= info->dpts[1], | 148 | && ntohs(sh->dest) <= info->dpts[1], |
149 | XT_SCTP_DEST_PORTS, info->flags, info->invflags) | 149 | XT_SCTP_DEST_PORTS, info->flags, info->invflags) |
150 | && SCCHECK(match_packet(skb, protoff + sizeof (sctp_sctphdr_t), | 150 | && SCCHECK(match_packet(skb, protoff + sizeof (sctp_sctphdr_t), |
151 | info->chunkmap, info->chunk_match_type, | 151 | info, hotdrop), |
152 | info->flag_info, info->flag_count, | ||
153 | hotdrop), | ||
154 | XT_SCTP_CHUNK_TYPES, info->flags, info->invflags); | 152 | XT_SCTP_CHUNK_TYPES, info->flags, info->invflags); |
155 | } | 153 | } |
156 | 154 | ||