Minor robustness fixes for debugging.
authorPhil Pennock <pdp@exim.org>
Mon, 21 Feb 2011 04:28:45 +0000 (23:28 -0500)
committerPhil Pennock <pdp@exim.org>
Mon, 21 Feb 2011 04:30:09 +0000 (23:30 -0500)
sig_atomic_t for signal-handlers.
getgroups() return value checking.
Developed for bug 927.

doc/doc-txt/ChangeLog
src/src/daemon.c
src/src/exim.c
src/src/globals.c
src/src/globals.h
src/src/mytypes.h

index 3f7a38c56afa8c960369f4d1d2a3fdbc9455cbf2..862f1b887a650a3bda9f6ebd379d82ce4fb1d867 100644 (file)
@@ -55,6 +55,11 @@ PP/09 New lookups functionality failed to compile on old gcc which rejects
       extern declarations in function scope.
       Patch from Oliver Fleischmann
 
+PP/10 Use sig_atomic_t for flags set from signal handlers.
+      Check getgroups() return and improve debugging.
+      Fixed developed for diagnosis in bug 927 (which turned out to be
+      a kernel bug).
+
 
 Exim version 4.74
 -----------------
index 3db9be374214e9e3f37b54af3e1c219c8c7f2cd1..c11e2ed0a3d81b40b8bdeedf1e49164f5e683978 100644 (file)
@@ -31,8 +31,8 @@ static smtp_slot empty_smtp_slot = { 0, NULL };
 *               Local static variables           *
 *************************************************/
 
-static volatile BOOL sigchld_seen;
-static volatile BOOL sighup_seen;
+static SIGNAL_BOOL sigchld_seen;
+static SIGNAL_BOOL sighup_seen;
 
 static int   accept_retry_count = 0;
 static int   accept_retry_errno;
index cf48c04b3f12dacadcbbfc5efe71483246520e3a..c368e590695f312a369d4b6ebcf14fbeab17d683 100644 (file)
@@ -570,17 +570,20 @@ if (euid == root_uid || euid != uid || egid != gid || igflag)
 
 DEBUG(D_uid)
   {
-  int group_count;
+  int group_count, save_errno;
   gid_t group_list[NGROUPS_MAX];
   debug_printf("changed uid/gid: %s\n  uid=%ld gid=%ld pid=%ld\n", msg,
     (long int)geteuid(), (long int)getegid(), (long int)getpid());
   group_count = getgroups(NGROUPS_MAX, group_list);
+  save_errno = errno;
   debug_printf("  auxiliary group list:");
   if (group_count > 0)
     {
     int i;
     for (i = 0; i < group_count; i++) debug_printf(" %d", (int)group_list[i]);
     }
+  else if (group_count < 0)
+    debug_printf(" <error: %s>", strerror(save_errno));
   else debug_printf(" <none>");
   debug_printf("\n");
   }
@@ -3281,6 +3284,11 @@ till after reading the config, which might specify the exim gid. Therefore,
 save the group list here first. */
 
 group_count = getgroups(NGROUPS_MAX, group_list);
+if (group_count < 0)
+  {
+  fprintf(stderr, "exim: getgroups() failed: %s\n", strerror(errno));
+  exit(EXIT_FAILURE);
+  }
 
 /* There is a fundamental difference in some BSD systems in the matter of
 groups. FreeBSD and BSDI are known to be different; NetBSD and OpenBSD are
index 3882a30741d86e2726a6c2b0c1f7e961ce8ba658..60ef8e0a8c57563007d2d8bf68b8812bbaafcdc3 100644 (file)
@@ -1073,7 +1073,7 @@ int     sender_verified_rc     = -1;
 BOOL    sender_verified_responded = FALSE;
 uschar *sending_ip_address     = NULL;
 int     sending_port           = -1;
-volatile  BOOL sigalrm_seen    = FALSE;
+SIGNAL_BOOL sigalrm_seen       = FALSE;
 uschar **sighup_argv           = NULL;
 int     smtp_accept_count      = 0;
 BOOL    smtp_accept_keepalive  = TRUE;
index cc9021e1b80948ddd969f1f9e239ca06a3d69b54..1f0463264c234fb2419517fa553885c04c3d5fc2 100644 (file)
@@ -18,6 +18,12 @@ local_scan.h header file. */
 extern int h_errno;
 #endif
 
+/* We need to be careful about width of int and atomicity in signal handlers,
+especially with the rise of 64-bit systems breaking older assumptions.  But
+sig_atomic_t comes from signal.h so can't go into mytypes.h without including
+signal support in local_scan, which seems precipitous. */
+typedef volatile sig_atomic_t SIGNAL_BOOL;
+
 /* Now things that are present only when configured. */
 
 #ifdef EXIM_PERL
@@ -659,7 +665,7 @@ extern address_item *sender_verified_list; /* Saved chain of sender verifies */
 extern address_item *sender_verified_failed; /* The one that caused denial */
 extern uschar *sending_ip_address;     /* Address of outgoing (SMTP) interface */
 extern int     sending_port;           /* Port of outgoing interface */
-extern volatile BOOL sigalrm_seen;     /* Flag for sigalrm_handler */
+extern SIGNAL_BOOL sigalrm_seen;       /* Flag for sigalrm_handler */
 extern uschar **sighup_argv;           /* Args for re-execing after SIGHUP */
 extern int     smtp_accept_count;      /* Count of connections */
 extern BOOL    smtp_accept_keepalive;  /* Set keepalive on incoming */
index 36860a892626e4cbe9a6c01a21b880e642d928eb..abf1f53338605d8aa204802383890832629dabfb 100644 (file)
@@ -42,8 +42,10 @@ the arguments of printf-like functions. This is done by a macro. */
 the standard header files, so we use "uschar". Solaris has u_char in
 sys/types.h. This is just a typing convenience, of course. */
 
-typedef int BOOL;
 typedef unsigned char uschar;
+typedef int BOOL;
+/* We also have SIGNAL_BOOL, which requires signal.h be included, so is defined
+elsewhere */
 
 
 /* These macros save typing for the casting that is needed to cope with the