Skip to content

Commit ae3b06e

Browse files
committed
Merge branch 'sctp_do_bind-leak'
Mao Wenan says: ==================== fix memory leak for sctp_do_bind First two patches are to do cleanup, remove redundant assignment, and change return type of sctp_get_port_local. Third patch is to fix memory leak for sctp_do_bind if failed to bind address. v2: add one patch to change return type of sctp_get_port_local. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 8f6617b + 29b99f5 commit ae3b06e

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

net/sctp/socket.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ static int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len)
309309
return retval;
310310
}
311311

312-
static long sctp_get_port_local(struct sock *, union sctp_addr *);
312+
static int sctp_get_port_local(struct sock *, union sctp_addr *);
313313

314314
/* Verify this is a valid sockaddr. */
315315
static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
@@ -399,9 +399,8 @@ static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
399399
* detection.
400400
*/
401401
addr->v4.sin_port = htons(snum);
402-
if ((ret = sctp_get_port_local(sk, addr))) {
402+
if (sctp_get_port_local(sk, addr))
403403
return -EADDRINUSE;
404-
}
405404

406405
/* Refresh ephemeral port. */
407406
if (!bp->port)
@@ -413,11 +412,13 @@ static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
413412
ret = sctp_add_bind_addr(bp, addr, af->sockaddr_len,
414413
SCTP_ADDR_SRC, GFP_ATOMIC);
415414

416-
/* Copy back into socket for getsockname() use. */
417-
if (!ret) {
418-
inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num);
419-
sp->pf->to_sk_saddr(addr, sk);
415+
if (ret) {
416+
sctp_put_port(sk);
417+
return ret;
420418
}
419+
/* Copy back into socket for getsockname() use. */
420+
inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num);
421+
sp->pf->to_sk_saddr(addr, sk);
421422

422423
return ret;
423424
}
@@ -7999,7 +8000,7 @@ static void sctp_unhash(struct sock *sk)
79998000
static struct sctp_bind_bucket *sctp_bucket_create(
80008001
struct sctp_bind_hashbucket *head, struct net *, unsigned short snum);
80018002

8002-
static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr)
8003+
static int sctp_get_port_local(struct sock *sk, union sctp_addr *addr)
80038004
{
80048005
struct sctp_sock *sp = sctp_sk(sk);
80058006
bool reuse = (sk->sk_reuse || sp->reuse);
@@ -8109,7 +8110,7 @@ static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr)
81098110

81108111
if (sctp_bind_addr_conflict(&ep2->base.bind_addr,
81118112
addr, sp2, sp)) {
8112-
ret = (long)sk2;
8113+
ret = 1;
81138114
goto fail_unlock;
81148115
}
81158116
}
@@ -8181,7 +8182,7 @@ static int sctp_get_port(struct sock *sk, unsigned short snum)
81818182
addr.v4.sin_port = htons(snum);
81828183

81838184
/* Note: sk->sk_num gets filled in if ephemeral port request. */
8184-
return !!sctp_get_port_local(sk, &addr);
8185+
return sctp_get_port_local(sk, &addr);
81858186
}
81868187

81878188
/*

0 commit comments

Comments
 (0)