]>
Commit | Line | Data |
---|---|---|
f9869f84 JB |
1 | This patch fixes bugs related to machine endianess (harmless on |
2 | little-endians, but causing that some of conntrack modules don't | |
3 | work on big-endian machines). | |
4 | ||
5 | Bugs fixed: | |
6 | * (debugging, not endianess related) compilation failure in | |
7 | destroy_expect() in ip_conntrack_core.c when debugging was enabled | |
8 | ||
9 | * (minor problem for now) fixed warning about format string used | |
10 | for conntrack->mark (which is unsigned long) - would be harmful on | |
11 | 64-bit big-endians | |
12 | ||
13 | * the real problem: the way that ip_conntrack_tuple structures were | |
14 | initialized was wrong - in compound literals port number was catched | |
15 | by the first dst.u union element, which is int64_t (so port was | |
16 | stored in 2 least significant bytes, i.e. 6 bytes after beginning of | |
17 | dst.u.tcp or dst.u.udp element). | |
18 | This fix uses C99 field specifiers. | |
19 | ||
20 | Aternative way to fix can be zeroing whole structure and then | |
21 | setting wanted fields in separate statements (like in | |
22 | ip_conntrack_pptp for example). | |
23 | ||
24 | ||
25 | Jakub Bogusz <qboosh@pld.org.pl> | |
26 | ||
27 | --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_standalone.c.orig Fri May 16 10:17:39 2003 | |
28 | +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_standalone.c Mon May 19 15:58:25 2003 | |
29 | @@ -105,7 +105,7 @@ | |
30 | len += sprintf(buffer + len, "use=%u ", | |
31 | atomic_read(&conntrack->ct_general.use)); | |
32 | #if defined(CONFIG_IP_NF_CONNTRACK_MARK) | |
33 | - len += sprintf(buffer + len, "mark=%d ", conntrack->mark); | |
34 | + len += sprintf(buffer + len, "mark=%ld ", conntrack->mark); | |
35 | #endif | |
36 | len += sprintf(buffer + len, "\n"); | |
37 | ||
38 | --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_core.c.orig Fri May 16 10:17:39 2003 | |
39 | +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_core.c Mon May 19 15:49:36 2003 | |
40 | @@ -211,8 +211,8 @@ | |
41 | static void | |
42 | destroy_expect(struct ip_conntrack_expect *exp) | |
43 | { | |
44 | - DEBUGP("destroy_expect(%p) use=%d\n", exp, atomic_read(exp->use)); | |
45 | - IP_NF_ASSERT(atomic_read(exp->use)); | |
46 | + DEBUGP("destroy_expect(%p) use=%d\n", exp, atomic_read(&exp->use)); | |
47 | + IP_NF_ASSERT(atomic_read(&exp->use)); | |
48 | IP_NF_ASSERT(!timer_pending(&exp->timeout)); | |
49 | ||
50 | kfree(exp); | |
51 | @@ -1446,8 +1446,8 @@ | |
52 | getorigdst(struct sock *sk, int optval, void *user, int *len) | |
53 | { | |
54 | struct ip_conntrack_tuple_hash *h; | |
55 | - struct ip_conntrack_tuple tuple = { { sk->rcv_saddr, { sk->sport } }, | |
56 | - { sk->daddr, { sk->dport }, | |
57 | + struct ip_conntrack_tuple tuple = { { sk->rcv_saddr, { .tcp = { sk->sport } } }, | |
58 | + { sk->daddr, { .tcp = { sk->dport } }, | |
59 | IPPROTO_TCP } }; | |
60 | ||
61 | /* We only do TCP at the moment: is there a better way? */ | |
62 | --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_ftp.c.orig Fri May 16 10:17:39 2003 | |
63 | +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_ftp.c Mon May 19 15:50:54 2003 | |
64 | @@ -366,11 +366,11 @@ | |
65 | { 0 } }, | |
66 | { htonl((array[0] << 24) | (array[1] << 16) | |
67 | | (array[2] << 8) | array[3]), | |
68 | - { htons(array[4] << 8 | array[5]) }, | |
69 | + { .tcp = { htons(array[4] << 8 | array[5]) } }, | |
70 | IPPROTO_TCP }}); | |
71 | exp->mask = ((struct ip_conntrack_tuple) | |
72 | { { 0xFFFFFFFF, { 0 } }, | |
73 | - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); | |
74 | + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); | |
75 | ||
76 | exp->expectfn = NULL; | |
77 | ||
78 | --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_h323.c.orig Fri May 16 10:17:39 2003 | |
79 | +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_h323.c Mon May 19 15:52:03 2003 | |
80 | @@ -108,11 +108,11 @@ | |
81 | { { ct->tuplehash[!dir].tuple.src.ip, | |
82 | { 0 } }, | |
83 | { data_ip, | |
84 | - { data_port }, | |
85 | + { .tcp = { data_port } }, | |
86 | IPPROTO_UDP }}); | |
87 | exp->mask = ((struct ip_conntrack_tuple) | |
88 | { { 0xFFFFFFFF, { 0 } }, | |
89 | - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); | |
90 | + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); | |
91 | ||
92 | exp->expectfn = NULL; | |
93 | ||
94 | @@ -237,11 +237,11 @@ | |
95 | { { ct->tuplehash[!dir].tuple.src.ip, | |
96 | { 0 } }, | |
97 | { data_ip, | |
98 | - { data_port }, | |
99 | + { .tcp = { data_port } }, | |
100 | IPPROTO_TCP }}); | |
101 | exp->mask = ((struct ip_conntrack_tuple) | |
102 | { { 0xFFFFFFFF, { 0 } }, | |
103 | - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); | |
104 | + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); | |
105 | ||
106 | exp->expectfn = h225_expect; | |
107 | ||
108 | --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_irc.c.orig Fri Nov 29 00:53:15 2002 | |
109 | +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_irc.c Mon May 19 15:54:24 2003 | |
110 | @@ -209,11 +209,11 @@ | |
111 | ||
112 | exp->tuple = ((struct ip_conntrack_tuple) | |
113 | { { 0, { 0 } }, | |
114 | - { htonl(dcc_ip), { htons(dcc_port) }, | |
115 | + { htonl(dcc_ip), { .tcp = { htons(dcc_port) } }, | |
116 | IPPROTO_TCP }}); | |
117 | exp->mask = ((struct ip_conntrack_tuple) | |
118 | { { 0, { 0 } }, | |
119 | - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); | |
120 | + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); | |
121 | ||
122 | exp->expectfn = NULL; | |
123 | ||
124 | --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_mms.c.orig Fri May 16 10:17:39 2003 | |
125 | +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_mms.c Mon May 19 15:55:06 2003 | |
126 | @@ -238,12 +238,12 @@ | |
127 | exp->tuple = ((struct ip_conntrack_tuple) | |
128 | { { ct->tuplehash[!dir].tuple.src.ip, { 0 } }, | |
129 | { mms_ip, | |
130 | - { (__u16) ntohs(mms_port) }, | |
131 | + { .tcp = { (__u16) ntohs(mms_port) } }, | |
132 | mms_proto } } | |
133 | ); | |
134 | exp->mask = ((struct ip_conntrack_tuple) | |
135 | { { 0xFFFFFFFF, { 0 } }, | |
136 | - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); | |
137 | + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); | |
138 | exp->expectfn = NULL; | |
139 | ip_conntrack_expect_related(ct, &expect); | |
140 | UNLOCK_BH(&ip_mms_lock); | |
141 | --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_quake3.c.orig Fri May 16 10:17:39 2003 | |
142 | +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_quake3.c Mon May 19 15:57:27 2003 | |
143 | @@ -82,12 +82,12 @@ | |
144 | exp.tuple = ((struct ip_conntrack_tuple) | |
145 | { { ct->tuplehash[!dir].tuple.src.ip, { 0 } }, | |
146 | { (u_int32_t) *((u_int32_t *)((int)udph + i)), | |
147 | - { (__u16) *((__u16 *)((int)udph+i+4)) }, | |
148 | + { .udp = { (__u16) *((__u16 *)((int)udph+i+4)) } }, | |
149 | IPPROTO_UDP } } | |
150 | ); | |
151 | exp.mask = ((struct ip_conntrack_tuple) | |
152 | { { 0xFFFFFFFF, { 0 } }, | |
153 | - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); | |
154 | + { 0xFFFFFFFF, { .udp = { 0xFFFF } }, 0xFFFF }}); | |
155 | exp.expectfn = NULL; | |
156 | ||
157 | ip_conntrack_expect_related(ct, &exp); | |
158 | --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_talk.c.orig Fri May 16 10:17:39 2003 | |
159 | +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_talk.c Mon May 19 16:00:41 2003 | |
160 | @@ -119,11 +119,11 @@ | |
161 | { { ct->tuplehash[dir].tuple.src.ip, | |
162 | { 0 } }, | |
163 | { ct->tuplehash[dir].tuple.dst.ip, | |
164 | - { htons(talk_port) }, | |
165 | + { .udp = { htons(talk_port) } }, | |
166 | IPPROTO_UDP }}); | |
167 | exp->mask = ((struct ip_conntrack_tuple) | |
168 | { { 0xFFFFFFFF, { 0 } }, | |
169 | - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); | |
170 | + { 0xFFFFFFFF, { .udp = { 0xFFFF } }, 0xFFFF }}); | |
171 | ||
172 | exp->expectfn = talk_expectfn[talk_port - TALK_PORT]; | |
173 | ||
174 | @@ -148,11 +148,11 @@ | |
175 | { { ct->tuplehash[!dir].tuple.src.ip, | |
176 | { 0 } }, | |
177 | { addr->ta_addr, | |
178 | - { addr->ta_port }, | |
179 | + { .tcp = { addr->ta_port } }, | |
180 | IPPROTO_TCP }}); | |
181 | exp->mask = ((struct ip_conntrack_tuple) | |
182 | { { 0xFFFFFFFF, { 0 } }, | |
183 | - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); | |
184 | + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); | |
185 | ||
186 | exp->expectfn = NULL; | |
187 |