diff options
-rw-r--r-- | net/sctp/bind_addr.c | 16 | ||||
-rw-r--r-- | net/sctp/protocol.c | 2 | ||||
-rw-r--r-- | net/sctp/sm_make_chunk.c | 4 | ||||
-rw-r--r-- | net/sctp/socket.c | 5 |
4 files changed, 15 insertions, 12 deletions
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index eafdd11152d0..eb3a5e25777d 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c | |||
@@ -155,15 +155,15 @@ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new, | |||
155 | if (!addr) | 155 | if (!addr) |
156 | return -ENOMEM; | 156 | return -ENOMEM; |
157 | 157 | ||
158 | memcpy(&addr->a_h, new, sizeof(*new)); | 158 | memcpy(&addr->a, new, sizeof(*new)); |
159 | 159 | ||
160 | /* Fix up the port if it has not yet been set. | 160 | /* Fix up the port if it has not yet been set. |
161 | * Both v4 and v6 have the port at the same offset. | 161 | * Both v4 and v6 have the port at the same offset. |
162 | */ | 162 | */ |
163 | if (!addr->a_h.v4.sin_port) | 163 | if (!addr->a.v4.sin_port) |
164 | addr->a_h.v4.sin_port = bp->port; | 164 | addr->a.v4.sin_port = htons(bp->port); |
165 | 165 | ||
166 | flip_to_n(&addr->a, &addr->a_h); | 166 | flip_to_h(&addr->a_h, &addr->a); |
167 | 167 | ||
168 | addr->use_as_src = use_as_src; | 168 | addr->use_as_src = use_as_src; |
169 | 169 | ||
@@ -264,6 +264,7 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, | |||
264 | int retval = 0; | 264 | int retval = 0; |
265 | int len; | 265 | int len; |
266 | struct sctp_af *af; | 266 | struct sctp_af *af; |
267 | union sctp_addr tmp; | ||
267 | 268 | ||
268 | /* Convert the raw address to standard address format */ | 269 | /* Convert the raw address to standard address format */ |
269 | while (addrs_len) { | 270 | while (addrs_len) { |
@@ -278,7 +279,8 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, | |||
278 | } | 279 | } |
279 | 280 | ||
280 | af->from_addr_param(&addr, rawaddr, port, 0); | 281 | af->from_addr_param(&addr, rawaddr, port, 0); |
281 | retval = sctp_add_bind_addr(bp, &addr, 1, gfp); | 282 | flip_to_n(&tmp, &addr); |
283 | retval = sctp_add_bind_addr(bp, &tmp, 1, gfp); | ||
282 | if (retval) { | 284 | if (retval) { |
283 | /* Can't finish building the list, clean up. */ | 285 | /* Can't finish building the list, clean up. */ |
284 | sctp_bind_addr_clean(bp); | 286 | sctp_bind_addr_clean(bp); |
@@ -358,6 +360,8 @@ static int sctp_copy_one_addr(struct sctp_bind_addr *dest, | |||
358 | int flags) | 360 | int flags) |
359 | { | 361 | { |
360 | int error = 0; | 362 | int error = 0; |
363 | union sctp_addr tmp; | ||
364 | flip_to_n(&tmp, addr); | ||
361 | 365 | ||
362 | if (sctp_is_any(addr)) { | 366 | if (sctp_is_any(addr)) { |
363 | error = sctp_copy_local_addr_list(dest, scope, gfp, flags); | 367 | error = sctp_copy_local_addr_list(dest, scope, gfp, flags); |
@@ -371,7 +375,7 @@ static int sctp_copy_one_addr(struct sctp_bind_addr *dest, | |||
371 | (((AF_INET6 == addr->sa.sa_family) && | 375 | (((AF_INET6 == addr->sa.sa_family) && |
372 | (flags & SCTP_ADDR6_ALLOWED) && | 376 | (flags & SCTP_ADDR6_ALLOWED) && |
373 | (flags & SCTP_ADDR6_PEERSUPP)))) | 377 | (flags & SCTP_ADDR6_PEERSUPP)))) |
374 | error = sctp_add_bind_addr(dest, addr, 1, gfp); | 378 | error = sctp_add_bind_addr(dest, &tmp, 1, gfp); |
375 | } | 379 | } |
376 | 380 | ||
377 | return error; | 381 | return error; |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index d08bafd4439e..a6bcbf560e36 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -234,7 +234,7 @@ int sctp_copy_local_addr_list(struct sctp_bind_addr *bp, sctp_scope_t scope, | |||
234 | (((AF_INET6 == addr->a_h.sa.sa_family) && | 234 | (((AF_INET6 == addr->a_h.sa.sa_family) && |
235 | (copy_flags & SCTP_ADDR6_ALLOWED) && | 235 | (copy_flags & SCTP_ADDR6_ALLOWED) && |
236 | (copy_flags & SCTP_ADDR6_PEERSUPP)))) { | 236 | (copy_flags & SCTP_ADDR6_PEERSUPP)))) { |
237 | error = sctp_add_bind_addr(bp, &addr->a_h, 1, | 237 | error = sctp_add_bind_addr(bp, &addr->a, 1, |
238 | GFP_ATOMIC); | 238 | GFP_ATOMIC); |
239 | if (error) | 239 | if (error) |
240 | goto end_copy; | 240 | goto end_copy; |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 2c887d3f3911..46cfcca5e41b 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -1507,7 +1507,9 @@ no_hmac: | |||
1507 | 1507 | ||
1508 | /* Also, add the destination address. */ | 1508 | /* Also, add the destination address. */ |
1509 | if (list_empty(&retval->base.bind_addr.address_list)) { | 1509 | if (list_empty(&retval->base.bind_addr.address_list)) { |
1510 | sctp_add_bind_addr(&retval->base.bind_addr, &chunk->dest, 1, | 1510 | union sctp_addr tmp; |
1511 | flip_to_n(&tmp, &chunk->dest); | ||
1512 | sctp_add_bind_addr(&retval->base.bind_addr, &tmp, 1, | ||
1511 | GFP_ATOMIC); | 1513 | GFP_ATOMIC); |
1512 | } | 1514 | } |
1513 | 1515 | ||
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 3dd7ada8026c..d09589a51c44 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -313,7 +313,6 @@ SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) | |||
313 | struct sctp_af *af; | 313 | struct sctp_af *af; |
314 | unsigned short snum; | 314 | unsigned short snum; |
315 | int ret = 0; | 315 | int ret = 0; |
316 | union sctp_addr tmp; | ||
317 | 316 | ||
318 | /* Common sockaddr verification. */ | 317 | /* Common sockaddr verification. */ |
319 | af = sctp_sockaddr_af(sp, addr, len); | 318 | af = sctp_sockaddr_af(sp, addr, len); |
@@ -369,8 +368,7 @@ SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) | |||
369 | sctp_write_lock(&ep->base.addr_lock); | 368 | sctp_write_lock(&ep->base.addr_lock); |
370 | 369 | ||
371 | /* Use GFP_ATOMIC since BHs are disabled. */ | 370 | /* Use GFP_ATOMIC since BHs are disabled. */ |
372 | flip_to_h(&tmp, addr); | 371 | ret = sctp_add_bind_addr(bp, addr, 1, GFP_ATOMIC); |
373 | ret = sctp_add_bind_addr(bp, &tmp, 1, GFP_ATOMIC); | ||
374 | sctp_write_unlock(&ep->base.addr_lock); | 372 | sctp_write_unlock(&ep->base.addr_lock); |
375 | sctp_local_bh_enable(); | 373 | sctp_local_bh_enable(); |
376 | 374 | ||
@@ -572,7 +570,6 @@ static int sctp_send_asconf_add_ip(struct sock *sk, | |||
572 | addr = (union sctp_addr *)addr_buf; | 570 | addr = (union sctp_addr *)addr_buf; |
573 | af = sctp_get_af_specific(addr->v4.sin_family); | 571 | af = sctp_get_af_specific(addr->v4.sin_family); |
574 | memcpy(&saveaddr, addr, af->sockaddr_len); | 572 | memcpy(&saveaddr, addr, af->sockaddr_len); |
575 | saveaddr.v4.sin_port = ntohs(saveaddr.v4.sin_port); | ||
576 | retval = sctp_add_bind_addr(bp, &saveaddr, 0, | 573 | retval = sctp_add_bind_addr(bp, &saveaddr, 0, |
577 | GFP_ATOMIC); | 574 | GFP_ATOMIC); |
578 | addr_buf += af->sockaddr_len; | 575 | addr_buf += af->sockaddr_len; |