Re: missing spin_unlock in tcp_v4_get_port

2005-08-22 Thread David S. Miller
From: Ted Unangst <[EMAIL PROTECTED]>
Subject: missing spin_unlock in tcp_v4_get_port
Date: Mon, 22 Aug 2005 14:17:36 -0700

> There appears to be a missing spin_unlock in tcp_v4_get_port.
> 
>  do {rover++;
>  if (rover > high)
>  rover = low;
>  head = _bhash[tcp_bhashfn(rover)];
>  spin_lock(>lock);
> head->lock is acquired.
>  tb_for_each(tb, node, >chain)
>  if (tb->port == rover)
>  goto next;
> we don't find what we want.  break out of while loop.
>  break;
>  next:
>  spin_unlock(>lock);
>  } while (--remaining > 0);
>  tcp_port_rover = rover;
>  spin_unlock(_portalloc_lock);
> 
>  /* Exhausted local port range during search? */
>  ret = 1;
>  if (remaining <= 0)
>  goto fail;
> here we go to fail; head->lock is still acquired.

Only if remaining <= 0, in which case we broke out of the loop due to
the "while (--remaining > 0)" test, not because of the "break;"
statement, and thus the lock is not held.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: missing spin_unlock in tcp_v4_get_port

2005-08-22 Thread David S. Miller
From: Ted Unangst [EMAIL PROTECTED]
Subject: missing spin_unlock in tcp_v4_get_port
Date: Mon, 22 Aug 2005 14:17:36 -0700

 There appears to be a missing spin_unlock in tcp_v4_get_port.
 
  do {rover++;
  if (rover  high)
  rover = low;
  head = tcp_bhash[tcp_bhashfn(rover)];
  spin_lock(head-lock);
 head-lock is acquired.
  tb_for_each(tb, node, head-chain)
  if (tb-port == rover)
  goto next;
 we don't find what we want.  break out of while loop.
  break;
  next:
  spin_unlock(head-lock);
  } while (--remaining  0);
  tcp_port_rover = rover;
  spin_unlock(tcp_portalloc_lock);
 
  /* Exhausted local port range during search? */
  ret = 1;
  if (remaining = 0)
  goto fail;
 here we go to fail; head-lock is still acquired.

Only if remaining = 0, in which case we broke out of the loop due to
the while (--remaining  0) test, not because of the break;
statement, and thus the lock is not held.
-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/