bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] pflocal/sock.c


From: Ognyan Kulev
Subject: [PATCH] pflocal/sock.c
Date: Wed, 24 Apr 2002 18:36:19 +0300
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0rc1) Gecko/20020421 Debian/1.rc1-1

Hi,

`pflocal/sock.c:sock_shutdown' can be called with both flags SHUTDOWN_READ and SHUTDOWN_WRITE set (according to `pflocal/socket.c:S_socket_shutdown'). When this happen the `sock->lock' mutex is unlocked before calling `pipe_remove_reader' but the next `if' statement (that checks for SHUTDOWN_WRITE) assumes that `sock->lock' is locked. Is this a problem? If this is the case a patch that partly rewrites the function is applied. Unfortunately i have no Hurd installed and i can't even compile Hurd right now.

The second patch replaces bzero with memset.

2002-04-24  Ognyan Kulev <ogi@fmi.uni-sofia.bg>

        * sock.c (sock_shutdown): When both SHUTDOWN_READ and
        SHUTDOWN_WRITE are set in FLAGS unlock sock->lock after all
        processing of `sock' is finished.
        (sock_create): Replace bzero with memset.

Regards
--
Ognyan Kulev <ogi@fmi.uni-sofia.bg>, "\"Programmer\""
--- sock.c.~1.27.~      Sun Apr  1 04:40:12 2001
+++ sock.c      Wed Apr 24 17:51:34 2002
@@ -1,6 +1,6 @@
 /* Sock functions
 
-   Copyright (C) 1995,96,2000,01 Free Software Foundation, Inc.
+   Copyright (C) 1995,96,2000,01,02 Free Software Foundation, Inc.
    Written by Miles Bader <miles@gnu.org>
 
    This program is free software; you can redistribute it and/or
@@ -449,6 +449,8 @@
 sock_shutdown (struct sock *sock, unsigned flags)
 {
   unsigned old_flags;
+  struct pipe *read_pipe = NULL;
+  struct pipe *write_pipe = NULL;
 
   mutex_lock (&sock->lock);
 
@@ -458,34 +460,23 @@
   if (flags & SOCK_SHUTDOWN_READ && !(old_flags & SOCK_SHUTDOWN_READ))
     /* Shutdown the read half.  */
     {
-      struct pipe *pipe = sock->read_pipe;
-      if (pipe != NULL)
-       {
-         sock->read_pipe = NULL;
-         /* Unlock SOCK here, as we may subsequently wake up other threads. */
-         mutex_unlock (&sock->lock);
-         pipe_remove_reader (pipe);
-       }
-      else
-       mutex_unlock (&sock->lock);
+      read_pipe = sock->read_pipe;
+      sock->read_pipe = NULL;
     }
-
   if (flags & SOCK_SHUTDOWN_WRITE && !(old_flags & SOCK_SHUTDOWN_WRITE))
     /* Shutdown the write half.  */
     {
-      struct pipe *pipe = sock->write_pipe;
-      if (pipe != NULL)
-       {
-         sock->write_pipe = NULL;
-         /* Unlock SOCK here, as we may subsequently wake up other threads. */
-         mutex_unlock (&sock->lock);
-         pipe_remove_writer (pipe);
-       }
-      else
-       mutex_unlock (&sock->lock);
+      write_pipe = sock->write_pipe;
+      sock->write_pipe = NULL;
     }
-  else
-    mutex_unlock (&sock->lock);
+
+  /* Unlock SOCK here, as we may subsequently wake up other threads. */
+  mutex_unlock (&sock->lock);
+  
+  if (read_pipe)
+    pipe_remove_reader (read_pipe);
+  if (write_pipe)
+    pipe_remove_writer (write_pipe);
 }
 
 /* ---------------------------------------------------------------- */
--- sock.c.sock_shutdown        Wed Apr 24 17:48:50 2002
+++ sock.c      Wed Apr 24 17:52:56 2002
@@ -17,7 +17,7 @@
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
-#include <string.h>            /* For bzero() */
+#include <string.h>            /* For memset() */
 
 #include <cthreads.h>
 
@@ -122,7 +122,7 @@ sock_create (struct pipe_class *pipe_cla
   new->connect_queue = NULL;
   new->pipe_class = pipe_class;
   new->addr = NULL;
-  bzero (&new->change_time, sizeof (new->change_time));
+  memset (&new->change_time, 0, sizeof (new->change_time));
   mutex_init (&new->lock);
 
   *sock = new;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]