2.4.36-stable kernel tree
Revision | 2bd6c95c3a00dadee6378e13c699006830d7e8e0 (tree) |
---|---|
Zeit | 2005-07-27 05:26:44 |
Autor | David S. Miller <davem@dave...> |
Commiter | David S. Miller |
[NETLINK]: Fix two socket hashing bugs.
1) netlink_release() should only decrement the hash entry
err = -ENOMEM;
if (BITS_PER_LONG > 32 && unlikely(hash->entries >= UINT_MAX))
goto err;
2) netlink_autobind() needs to propagate the error return from
Thanks to Jakub Jelink for providing backtraces. Also, thanks to
Herbert Xu for supplying debugging patches to help track this down,
and also finding a mistake in an earlier version of this fix.
Signed-off-by: David S. Miller <davem@davemloft.net>
@@ -330,9 +330,9 @@ static void netlink_remove(struct sock *sk) | ||
330 | 330 | u32 pid = nlk_sk(sk)->pid; |
331 | 331 | |
332 | 332 | netlink_table_grab(); |
333 | - hash->entries--; | |
334 | 333 | for (skp = nl_pid_hashfn(hash, pid); *skp; skp = &((*skp)->next)) { |
335 | 334 | if (*skp == sk) { |
335 | + hash->entries--; | |
336 | 336 | *skp = sk->next; |
337 | 337 | __sock_put(sk); |
338 | 338 | break; |
@@ -450,7 +450,12 @@ retry: | ||
450 | 450 | err = netlink_insert(sk, pid); |
451 | 451 | if (err == -EADDRINUSE) |
452 | 452 | goto retry; |
453 | - return 0; | |
453 | + | |
454 | + /* If 2 threads race to autobind, that is fine. */ | |
455 | + if (err == -EBUSY) | |
456 | + err = 0; | |
457 | + | |
458 | + return err; | |
454 | 459 | } |
455 | 460 | |
456 | 461 | static inline int netlink_capable(struct socket *sock, unsigned int flag) |