[comp.bugs.sys5] Serious misfeature in smail2.2 under SVr3

eric@snark.uu.net (Eric S. Raymond) (05/07/89)

THE SYMPTOM:
   On SVr3.0 and later UNIXes installation of smail2.3 may cause /etc/profile
processing to hang, preventing users (including root!) from logging in. This
behavior was first observed on a Toshiba 5100 running T/PIX.

THE PROBLEM:
   These systems call mail -e to check mail. The svbinmail supplied with 2.3
and earlier versions of smail interprets -e as a directive to go into reader
mode, waiting for input. Because /etc/profile typically traps and eats
interrupts, this can result in a hang and serious lossage.

THE FIX:
   Teach svbinmail how to do `mail -e' properly. This fix should be portable
to BSD systems, but has been tested unly on SV. It is not complicated.
To apply, simply pipe this article through patch -d <smaildir>/src where
<smaildir> is your toplevel smail source directory.

SMAIL 3.0 DEVELOPERS:
   Please incorporate this code or equivalent. The last thing we need is
for this bug to survive in your stuff...

*** svbinmail.c.old	Sat May  6 09:04:11 1989
--- svbinmail.c	Sat May  6 10:03:07 1989
***************
*** 11,21 ****
--- 11,26 ----
  /*  */
  
  #include <stdio.h>
+ #include <pwd.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
  #include "defs.h"
  #ifdef BSD
  #include <strings.h>
+ #define MAILDIR	"/usr/spool/mail/%s"
  #else
  #include <string.h>
+ #define MAILDIR	"/usr/mail/%s"
  #endif
  
  #ifdef SENDMAIL
***************
*** 32,37 ****
--- 37,43 ----
  char prog[128];
  
  void	perror(), exit(), usage();
+ struct passwd	*getpwuid();
  
  main(argc, argv)
  int argc;
***************
*** 53,58 ****
--- 59,79 ----
  		while((c = getopt(argc, argv, "epqrtf:")) != EOF) {
  			switch(c) {
  			case 'e':
+ 				{
+ 					char	mailfile[BUFSIZ];
+ 					struct stat stbuf;
+ 					struct passwd *pw;
+ 
+ 					if ((pw = getpwuid(getuid())) == 0)
+ 						return(2);
+ 					(void) sprintf(mailfile,
+ 						MAILDIR, pw->pw_name);
+ 					if (stat(mailfile, &stbuf) == -1)
+ 						return(1);
+ 					else
+ 						return(stbuf.st_size == 0);
+ 				}
+ 				break;
  			case 'p':
  			case 'q':
  			case 'r':
-- 
      Eric S. Raymond                       (the mad mastermind of TMN-Netnews)
      uunet!snark!eric | eric@snark.uu.net  Phone: (215)-296-5718

wisner@terminator.cc.umich.edu (Bill Wisner) (05/14/89)

(Eric S. Raymond)
>   On SVr3.0 and later UNIXes installation of smail2.3 [...]

Get smail2.5. This may or may not fix your problem, but do it anyway.
Available from your friendly neighborhood comp.sources.unix archive.

>SMAIL 3.0 DEVELOPERS:
>   Please incorporate this code or equivalent. The last thing we need is
>for this bug to survive in your stuff...

Smail3.0 is all new. Totally original. Complete rewrite from ground zero.
Not a scrap of old code in it.

I think.

It's still a very fun toy.