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.
{
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);