diff options
Diffstat (limited to 'net/sctp/socket.c')
-rw-r--r-- | net/sctp/socket.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 54722e622e6d..dab15949958e 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -1289,9 +1289,13 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout) | |||
1289 | } | 1289 | } |
1290 | } | 1290 | } |
1291 | 1291 | ||
1292 | if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) | 1292 | if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) { |
1293 | sctp_primitive_ABORT(asoc, NULL); | 1293 | struct sctp_chunk *chunk; |
1294 | else | 1294 | |
1295 | chunk = sctp_make_abort_user(asoc, NULL, 0); | ||
1296 | if (chunk) | ||
1297 | sctp_primitive_ABORT(asoc, chunk); | ||
1298 | } else | ||
1295 | sctp_primitive_SHUTDOWN(asoc, NULL); | 1299 | sctp_primitive_SHUTDOWN(asoc, NULL); |
1296 | } | 1300 | } |
1297 | 1301 | ||
@@ -1520,8 +1524,16 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
1520 | goto out_unlock; | 1524 | goto out_unlock; |
1521 | } | 1525 | } |
1522 | if (sinfo_flags & SCTP_ABORT) { | 1526 | if (sinfo_flags & SCTP_ABORT) { |
1527 | struct sctp_chunk *chunk; | ||
1528 | |||
1529 | chunk = sctp_make_abort_user(asoc, msg, msg_len); | ||
1530 | if (!chunk) { | ||
1531 | err = -ENOMEM; | ||
1532 | goto out_unlock; | ||
1533 | } | ||
1534 | |||
1523 | SCTP_DEBUG_PRINTK("Aborting association: %p\n", asoc); | 1535 | SCTP_DEBUG_PRINTK("Aborting association: %p\n", asoc); |
1524 | sctp_primitive_ABORT(asoc, msg); | 1536 | sctp_primitive_ABORT(asoc, chunk); |
1525 | err = 0; | 1537 | err = 0; |
1526 | goto out_unlock; | 1538 | goto out_unlock; |
1527 | } | 1539 | } |