Subject: Interoverlay use of static functions causes sendmail to bomb (#308) Index: usr.lib/sendmail/{conf,util,usersmtp}.c 2.11BSD Description: Sendmail mysteriously dies when performing timer related activities such as running the queue or timing out a response from a remote system. Repeat-By: Very difficult. If sendmail infrequently simply disappears at random infrequent intervals then it is likely to be caused by this problem. Fix: Apply the fix below, recompile, reinstall and restart sendmail. Remember to refreeze the configuration file before restarting sendmail. The problem was caused by passing the address of 'static' functions between overlays. This caused the address of the actual (overlay specific) function to be passed rather than the address of the 'thunk' (intermediate transfer vector). Declaring a function static inhibits the linker from generating a thunk for the function. Thus 'static' functions must _not_ be referenced outside the overlay in which they reside. Removing the 'static' declarations fixes the problem. Cut where indicated, saving to a file (/tmp/308). Then: patch -p0 < /tmp/308 cd /usr/src/usr.lib/sendmail/src make make install make clean Then kill the old sendmail process if one is running. /usr/lib/sendmail -bz /usr/lib/sendmail -bd -q30m (adjust the queue run interval to suit local preferences) ----------------------cut here-------------------- *** /usr/src/usr.lib/sendmail/src/clock.c.old Wed Feb 10 15:26:09 1988 --- /usr/src/usr.lib/sendmail/src/clock.c Sun Mar 10 19:56:34 1996 *************** *** 9,15 **** */ #if !defined(lint) && !defined(NOSCCS) ! static char SccsId[] = "@(#)clock.c 5.4 (Berkeley) 12/17/85"; #endif # include "sendmail.h" --- 9,15 ---- */ #if !defined(lint) && !defined(NOSCCS) ! static char SccsId[] = "@(#)clock.c 5.4.1 (2.11BSD) 1996/3/10"; #endif # include "sendmail.h" *************** *** 228,234 **** pause(); } - static endsleep() { SleepDone = TRUE; --- 228,233 ---- *** /usr/src/usr.lib/sendmail/src/usersmtp.c.old Fri Jul 15 14:38:05 1994 --- /usr/src/usr.lib/sendmail/src/usersmtp.c Sun Mar 10 19:58:51 1996 *************** *** 16,27 **** # ifndef SMTP #if !defined(lint) && !defined(NOSCCS) ! static char SccsId[] = "@(#)usersmtp.c 5.7.1 (2.11BSD GTE) 7/15/94 (no SMTP)"; # endif # else SMTP #if !defined(lint) && !defined(NOSCCS) ! static char SccsId[] = "@(#)usersmtp.c 5.7.1 (2.11BSD GTE) 7/15/94"; # endif --- 16,27 ---- # ifndef SMTP #if !defined(lint) && !defined(NOSCCS) ! static char SccsId[] = "@(#)usersmtp.c 5.7.2 (2.11BSD GTE) 1996/3/10(no SMTP)"; # endif # else SMTP #if !defined(lint) && !defined(NOSCCS) ! static char SccsId[] = "@(#)usersmtp.c 5.7.2 (2.11BSD GTE) 1996/3/10"; # endif *************** *** 75,81 **** register int r; EVENT *gte; char buf[MAXNAME]; ! extern greettimeout(); /* ** Open the connection to the mailer. --- 75,81 ---- register int r; EVENT *gte; char buf[MAXNAME]; ! int greettimeout(); /* ** Open the connection to the mailer. *************** *** 213,219 **** } - static greettimeout() { /* timeout reading the greeting message */ --- 213,218 ---- *** /usr/src/usr.lib/sendmail/src/util.c.old Tue Mar 7 21:29:24 1995 --- /usr/src/usr.lib/sendmail/src/util.c Sun Mar 10 19:59:58 1996 *************** *** 9,15 **** */ #if !defined(lint) && !defined(NOSCCS) ! static char SccsId[] = "@(#)util.c 5.8.1 (2.11BSD GTE) 3/07/95"; #endif # include --- 9,15 ---- */ #if !defined(lint) && !defined(NOSCCS) ! static char SccsId[] = "@(#)util.c 5.8.2 (2.11BSD GTE) 1996/3/10"; #endif # include *************** *** 615,621 **** { register EVENT *ev = NULL; register char *p; ! extern readtimeout(); /* set the timeout */ if (ReadTimeout != 0) --- 615,621 ---- { register EVENT *ev = NULL; register char *p; ! int readtimeout(); /* set the timeout */ if (ReadTimeout != 0) *************** *** 655,661 **** return (buf); } - static readtimeout() { longjmp(CtxReadTimeout, 1); --- 655,660 ---- *** /VERSION.old Fri Mar 8 22:54:36 1996 --- /VERSION Sun Mar 10 20:00:16 1996 *************** *** 1,4 **** ! Current Patch Level: 307 2.11 BSD ============ --- 1,4 ---- ! Current Patch Level: 308 2.11 BSD ============