Local port leak on nl_socket_alloc/nl_socket_set_local_port(, 0)

I've found a bug in the following scenario (fragment of code):

while (1) {
    struct nl_sock *sk = nl_socket_alloc();

    if (sk == NULL) {
        fprintf(stderr, "Failed to allocate nl socket\n");
	break;
    }
    nl_socket_set_local_port(sk, 0);
    nl_socket_free(sk);
}

The problem is that nl_socket_set_local_port(, 0) does not
release local port if it is allocated before.
This commit is contained in:
Andrew Rybchenko 2011-08-30 09:27:37 +04:00 committed by Thomas Graf
parent 4be7adbb71
commit b367024167

View file

@ -268,7 +268,14 @@ void nl_socket_set_local_port(struct nl_sock *sk, uint32_t port)
{
if (port == 0) {
port = generate_local_port();
sk->s_flags &= ~NL_OWN_PORT;
/*
* Release local port after generation of a new one to be
* able to change local port using nl_socket_set_local_port(, 0)
*/
if (!(sk->s_flags & NL_OWN_PORT))
release_local_port(sk->s_local.nl_pid);
else
sk->s_flags &= ~NL_OWN_PORT;
} else {
if (!(sk->s_flags & NL_OWN_PORT))
release_local_port(sk->s_local.nl_pid);