[PATCH] ipv4 skbuff locking scope

From: Tom Leete (tleete@mountain.net)
Date: Mon Oct 30 2000 - 17:24:24 EST


Hello,

This fixes tests of a socket buffer done without holding the
lock. tcp_data_wait() and wait_for_tcp_memory() both had
unguarded refs in their sleep conditionals.

Tom

--- linux-2.4.0-test10-pre5/net/ipv4/tcp.c~ Sun Oct 29 01:21:09 2000
+++ linux/net/ipv4/tcp.c Mon Oct 30 16:53:19 2000
@@ -204,6 +204,9 @@
  * Andi Kleen : Make poll agree with SIGIO
  * Salvatore Sanfilippo : Support SO_LINGER with linger == 1 and
  * lingertime == 0 (RFC 793 ABORT Call)
+ * Tom Leete : Fix locking scope in
+ * wait_for_tcp_memory, tcp_data_wait
+ *
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -871,10 +874,11 @@
                         break;
                 if (sk->err)
                         break;
- release_sock(sk);
- if (!tcp_memory_free(sk) || vm_wait)
+ if (!tcp_memory_free(sk) || vm_wait) {
+ release_sock(sk);
                         current_timeo = schedule_timeout(current_timeo);
- lock_sock(sk);
+ lock_sock(sk);
+ }
                 if (vm_wait) {
                         if (timeo != MAX_SCHEDULE_TIMEOUT &&
                             (timeo -= vm_wait-current_timeo) < 0)
@@ -1273,12 +1277,12 @@
         __set_current_state(TASK_INTERRUPTIBLE);
 
         set_bit(SOCK_ASYNC_WAITDATA, &sk->socket->flags);
- release_sock(sk);
 
- if (skb_queue_empty(&sk->receive_queue))
+ if (skb_queue_empty(&sk->receive_queue)){
+ release_sock(sk);
                 timeo = schedule_timeout(timeo);
-
- lock_sock(sk);
+ lock_sock(sk);
+ }
         clear_bit(SOCK_ASYNC_WAITDATA, &sk->socket->flags);
 
         remove_wait_queue(sk->sleep, &wait);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue Oct 31 2000 - 21:00:28 EST