]> arthur.barton.de Git - netatalk.git/commitdiff
deadlock in signal handlers and OSX 10.3 connection probe
authordidg <didg>
Wed, 5 Nov 2003 06:41:01 +0000 (06:41 +0000)
committerdidg <didg>
Wed, 5 Nov 2003 06:41:01 +0000 (06:41 +0000)
NEWS
etc/afpd/afp_dsi.c
etc/afpd/main.c
libatalk/asp/asp_getsess.c
libatalk/dsi/dsi_stream.c
libatalk/dsi/dsi_tcp.c
libatalk/util/logger.c
libatalk/util/server_child.c

diff --git a/NEWS b/NEWS
index bf8c4bf7e58135986556f68e52c718517983521c..6c32ccb14fdac9d5b8be9e75debd71a7369b5015 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,8 @@ Changes in 1.6.4
        not set. [Sam Noble]
 * FIX: afpd: Catsearch, fix possible SIGSEGV
 * FIX: cnid: Fix compile problems on Tru64. [Burkhard Schmidt]
+* FIX: deadlock in signal handlers (Redhat 9)
+* FIX: don't log network probe (OSX 10.3)
 
 Changes in 1.6.3
 ================
index 9f87428434aff24173c3f72a9cb0e2959ec0e5cb..23a2c604f1f622e16227e18b0cac88f3abc7a44e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: afp_dsi.c,v 1.24.2.2 2003-06-09 15:09:06 srittau Exp $
+ * $Id: afp_dsi.c,v 1.24.2.3 2003-11-05 06:41:01 didg Exp $
  *
  * Copyright (c) 1999 Adrian Sun (asun@zoology.washington.edu)
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
@@ -178,6 +178,9 @@ void afp_over_dsi(AFPObj *obj)
     sigemptyset( &action.sa_mask );
     sigaddset(&action.sa_mask, SIGALRM);
     sigaddset(&action.sa_mask, SIGTERM);
+#ifdef SERVERTEXT
+    sigaddset(&action.sa_mask, SIGUSR2);
+#endif
     action.sa_flags = SA_RESTART;
     if ( sigaction( SIGHUP, &action, 0 ) < 0 ) {
         LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) );
@@ -188,6 +191,9 @@ void afp_over_dsi(AFPObj *obj)
     sigemptyset( &action.sa_mask );
     sigaddset(&action.sa_mask, SIGALRM);
     sigaddset(&action.sa_mask, SIGHUP);
+#ifdef SERVERTEXT
+    sigaddset(&action.sa_mask, SIGUSR2);
+#endif
     action.sa_flags = SA_RESTART;
     if ( sigaction( SIGTERM, &action, 0 ) < 0 ) {
         LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) );
@@ -198,7 +204,9 @@ void afp_over_dsi(AFPObj *obj)
     /* Added for server message support */
     action.sa_handler = afp_dsi_getmesg;
     sigemptyset( &action.sa_mask );
-    sigaddset(&action.sa_mask, SIGUSR2);
+    sigaddset(&action.sa_mask, SIGTERM);
+    sigaddset(&action.sa_mask, SIGALRM);
+    sigaddset(&action.sa_mask, SIGHUP);
     action.sa_flags = SA_RESTART;
     if ( sigaction( SIGUSR2, &action, 0) < 0 ) {
         LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) );
@@ -221,6 +229,9 @@ void afp_over_dsi(AFPObj *obj)
     sigemptyset(&action.sa_mask);
     sigaddset(&action.sa_mask, SIGHUP);
     sigaddset(&action.sa_mask, SIGTERM);
+#ifdef SERVERTEXT
+    sigaddset(&action.sa_mask, SIGUSR2);
+#endif
     action.sa_flags = SA_RESTART;
     if ((sigaction(SIGALRM, &action, NULL) < 0) ||
             (setitimer(ITIMER_REAL, &dsi->timer, NULL) < 0)) {
index 91ad85e9909afa52a0d31b2f8b7114fb1a1151a0..2c3a06f33bef40da77030219da810de8ee165615 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: main.c,v 1.20 2002-10-04 15:15:05 srittau Exp $
+ * $Id: main.c,v 1.20.2.1 2003-11-05 06:41:01 didg Exp $
  *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -143,6 +143,7 @@ char        **av;
     fd_set              rfds;
     struct sigaction   sv;
     sigset_t            sigs;
+    int                 ret;
 
 #ifdef TRU64
     argc = ac;
@@ -180,6 +181,9 @@ char        **av;
     memset(&sv, 0, sizeof(sv));
     sv.sa_handler = child_handler;
     sigemptyset( &sv.sa_mask );
+    sigaddset(&sv.sa_mask, SIGALRM);
+    sigaddset(&sv.sa_mask, SIGHUP);
+    sigaddset(&sv.sa_mask, SIGTERM);
     sv.sa_flags = SA_RESTART;
     if ( sigaction( SIGCHLD, &sv, 0 ) < 0 ) {
         LOG(log_error, logtype_afpd, "main: sigaction: %s", strerror(errno) );
@@ -188,13 +192,20 @@ char      **av;
 
     sv.sa_handler = afp_goaway;
     sigemptyset( &sv.sa_mask );
-    sigaddset(&sv.sa_mask, SIGHUP);
+    sigaddset(&sv.sa_mask, SIGALRM);
     sigaddset(&sv.sa_mask, SIGTERM);
+    sigaddset(&sv.sa_mask, SIGCHLD);
     sv.sa_flags = SA_RESTART;
     if ( sigaction( SIGHUP, &sv, 0 ) < 0 ) {
         LOG(log_error, logtype_afpd, "main: sigaction: %s", strerror(errno) );
         afp_exit(1);
     }
+
+    sigemptyset( &sv.sa_mask );
+    sigaddset(&sv.sa_mask, SIGALRM);
+    sigaddset(&sv.sa_mask, SIGHUP);
+    sigaddset(&sv.sa_mask, SIGCHLD);
+    sv.sa_flags = SA_RESTART;
     if ( sigaction( SIGTERM, &sv, 0 ) < 0 ) {
         LOG(log_error, logtype_afpd, "main: sigaction: %s", strerror(errno) );
         afp_exit(1);
@@ -209,8 +220,13 @@ char       **av;
      */
 
     sigemptyset(&sigs);
+    sigaddset(&sigs, SIGALRM);
     sigaddset(&sigs, SIGHUP);
+#if 0 
+    /* don't block SIGTERM */   
     sigaddset(&sigs, SIGTERM);
+#endif    
+    sigaddset(&sigs, SIGCHLD);
     sigprocmask(SIG_BLOCK, &sigs, NULL);
     if (!(configs = configinit(&default_options))) {
         LOG(log_error, logtype_afpd, "main: no servers configured: %s\n", strerror(errno));
@@ -234,7 +250,10 @@ char       **av;
      * solution. */
     while (1) {
         rfds = save_rfds;
-        if (select(FD_SETSIZE, &rfds, NULL, NULL, NULL) < 0) {
+        sigprocmask(SIG_UNBLOCK, &sigs, NULL);
+        ret = select(FD_SETSIZE, &rfds, NULL, NULL, NULL);
+        sigprocmask(SIG_BLOCK, &sigs, NULL);
+        if (ret < 0) {
             if (errno == EINTR)
                 continue;
             LOG(log_error, logtype_afpd, "main: can't wait for input: %s", strerror(errno));
index 2ed1eda7231762e6f8bca4429114a78a7a2b6b10..6d0259f15d46f16fa367250caf1a1122deb671c7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: asp_getsess.c,v 1.7 2002-06-18 23:45:16 didg Exp $
+ * $Id: asp_getsess.c,v 1.7.2.1 2003-11-05 06:41:02 didg Exp $
  *
  * Copyright (c) 1990,1996 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -135,10 +135,15 @@ ASP asp_getsession(ASP asp, server_child *server_children,
       /* install cleanup pointer */
       server_child_setup(children, CHILD_ASPFORK, child_cleanup);
 
-      /* install tickle handler */
+      /* install tickle handler 
+       * we are the parent process
+       */
       memset(&action, 0, sizeof(action));
       action.sa_handler = tickle_handler;
       sigemptyset(&action.sa_mask);
+      sigaddset(&action.sa_mask, SIGHUP);
+      sigaddset(&action.sa_mask, SIGTERM);
+      sigaddset(&action.sa_mask, SIGCHLD);
       action.sa_flags = SA_RESTART;
 
       timer.it_interval.tv_sec = timer.it_value.tv_sec = tickleval;
index 54b6d456c78bb9e0dd204e0c9cebe48f4f794812..333d2fd8b394a6a55f3fda21a1f22e0916b7ae66 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_stream.c,v 1.9 2002-10-11 14:18:39 didg Exp $
+ * $Id: dsi_stream.c,v 1.8.4.1 2003-11-05 06:41:02 didg Exp $
  *
  * Copyright (c) 1998 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -78,7 +78,10 @@ size_t dsi_stream_read(DSI *dsi, void *data, const size_t length)
     else if (len > 0)
       stored += len;
     else { /* eof or error */
-      LOG(log_error, logtype_default, "dsi_stream_read(%d): %s", len, (len < 0)?strerror(errno):"unexpected EOF");
+      /* don't log EOF error if it's just after connect (OSX 10.3 probe) */
+      if (len || stored || dsi->read_count) {
+          LOG(log_error, logtype_default, "dsi_stream_read(%d): %s", len, (len < 0)?strerror(errno):"unexpected EOF");
+      }
       break;
     }
   }
@@ -96,7 +99,7 @@ int dsi_stream_send(DSI *dsi, void *buf, size_t length)
   sigset_t oldset;
 #ifdef USE_WRITEV
   struct iovec iov[2];
-  size_t towrite;
+  size_t  towrite;
   ssize_t len;
 #endif /* USE_WRITEV */
 
@@ -170,8 +173,8 @@ int dsi_stream_send(DSI *dsi, void *buf, size_t length)
 /* read data. function on success. 0 on failure. data length gets
  * stored in length variable. this should really use size_t's, but
  * that would require changes elsewhere. */
-int dsi_stream_receive(DSI *dsi, void *buf, const size_t ilength,
-                      size_t *rlength)
+int dsi_stream_receive(DSI *dsi, void *buf, const int ilength,
+                      int *rlength)
 {
   char block[DSI_BLOCKSIZ];
 
index 008edf895eeb72220627abcf234b24d9ad9a51f4..ca0060b5cfde4550258a395bd577d27ff2ba658c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_tcp.c,v 1.9 2002-01-24 16:27:31 jmarcus Exp $
+ * $Id: dsi_tcp.c,v 1.9.4.1 2003-11-05 06:41:02 didg Exp $
  *
  * Copyright (c) 1997, 1998 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -148,7 +148,12 @@ static int dsi_tcp_open(DSI *dsi)
     
     /* read in the first two bytes */
     len = dsi_stream_read(dsi, block, 2);
-    if (len <= 0 || (block[0] > DSIFL_MAX) || (block[1] > DSIFUNC_MAX)) {
+    if (!len ) {
+      /* connection already closed, don't log it (normal OSX 10.3 behaviour) */
+      exit(1);
+    }
+
+    if (len < 2 || (block[0] > DSIFL_MAX) || (block[1] > DSIFUNC_MAX)) {
       LOG(log_error, logtype_default, "dsi_tcp_open: invalid header");
       exit(1);
     }      
index 5076f0d450b0004a2049d49ad5533842c05854ca..79abbb438638c9b01bc7df40a2540be8b018296f 100644 (file)
@@ -522,6 +522,16 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
   char log_details_buffer[MAXLOGSIZE];
 
   log_file_data_pair *logs;
+  
+  /* fn is not reentrant but is used in signal handler 
+   * with LOGGER it's a little late source name and line number
+   * are already changed.
+  */
+  static int inlog = 0;
+
+  if (inlog)
+     return;
+  inlog = 1;
 
   log_init();
 
@@ -593,6 +603,7 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
         LOG(log_severe, logtype_logger, "can't open Logfile %s", 
            (*logs)[1].log_filename
            );
+       inlog = 0;
         return;
       }
     }
@@ -626,6 +637,7 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
   global_log_data.temp_src_filename = NULL;
   global_log_data.temp_src_linenumber = 0;
 #endif /* DISABLE_LOGGER */
+  inlog = 0;
 }
 
 #ifndef DISABLE_LOGGER
index d443eb2b0876eed74482e8dd3c20ef8b9d621b3e..cb6ee25eaf2fe8919f4921ec04b6b3b545fed4ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: server_child.c,v 1.7 2002-10-07 19:14:41 didg Exp $
+ * $Id: server_child.c,v 1.7.2.1 2003-11-05 06:41:03 didg Exp $
  *
  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -127,18 +127,18 @@ int server_child_add(server_child *children, const int forkid,
 {
   server_child_fork *fork;
   struct server_child_data *child;
-  sigset_t sig;
+  sigset_t sig, oldsig;
 
   /* we need to prevent deletions from occuring before we get a 
    * chance to add the child in. */
   sigemptyset(&sig);
   sigaddset(&sig, SIGCHLD);
-  sigprocmask(SIG_BLOCK, &sig, NULL);
+  sigprocmask(SIG_BLOCK, &sig, &oldsig);
 
   /* it's possible that the child could have already died before the
    * sigprocmask. we need to check for this. */
   if (kill(pid, 0) < 0) {
-    sigprocmask(SIG_UNBLOCK, &sig, NULL);
+    sigprocmask(SIG_SETMASK, &oldsig, NULL);
     return 1;
   }
 
@@ -146,20 +146,20 @@ int server_child_add(server_child *children, const int forkid,
 
   /* if we already have an entry. just return. */
   if (resolve_child(fork->table, pid)) {
-    sigprocmask(SIG_UNBLOCK, &sig, NULL);
+    sigprocmask(SIG_SETMASK, &oldsig, NULL);
     return 0;
   }
 
   if ((child = (struct server_child_data *) 
        calloc(1, sizeof(struct server_child_data))) == NULL) {
-    sigprocmask(SIG_UNBLOCK, &sig, NULL);
+    sigprocmask(SIG_SETMASK, &oldsig, NULL);
     return -1;
   }
 
   child->pid = pid;
   hash_child(fork->table, child);
   children->count++;
-  sigprocmask(SIG_UNBLOCK, &sig, NULL);
+  sigprocmask(SIG_SETMASK, &oldsig, NULL);
 
   return 0;
 }
@@ -255,7 +255,6 @@ void server_child_handler(server_child *children)
        break;
       }
     }
-    
     if (WIFEXITED(status)) {
       if (WEXITSTATUS(status)) {
        LOG(log_info, logtype_default, "server_child[%d] %d exited %d", i, pid,