diff -up sendmail-8.14.3/sendmail/envelope.c.exitpanic sendmail-8.14.3/sendmail/envelope.c --- sendmail-8.14.3/sendmail/envelope.c.exitpanic 2008-03-31 18:32:13.000000000 +0200 +++ sendmail-8.14.3/sendmail/envelope.c 2009-12-15 13:55:52.000000000 +0100 @@ -163,14 +163,14 @@ newenvelope(e, parent, rpool) ** split -- if true, split by recipient if message is queued up ** ** Returns: -** none. +** true if savemail panic'ed. ** ** Side Effects: ** housekeeping necessary to dispose of an envelope. ** Unlocks this queue file. */ -void +bool dropenvelope(e, fulldrop, split) register ENVELOPE *e; bool fulldrop; @@ -209,7 +209,7 @@ dropenvelope(e, fulldrop, split) /* we must have an id to remove disk files */ if (id == NULL) - return; + return panic; /* if verify-only mode, we can skip most of this */ if (OpMode == MD_VERIFY) @@ -618,6 +618,8 @@ simpledrop: } e->e_id = NULL; e->e_flags &= ~EF_HAS_DF; + + return panic; } /* ** CLEARENVELOPE -- clear an envelope without unlocking diff -up sendmail-8.14.3/sendmail/main.c.exitpanic sendmail-8.14.3/sendmail/main.c --- sendmail-8.14.3/sendmail/main.c.exitpanic 2008-03-31 18:32:13.000000000 +0200 +++ sendmail-8.14.3/sendmail/main.c 2009-12-15 13:55:52.000000000 +0100 @@ -2952,7 +2952,9 @@ finis(drop, cleanup, exitstat) { if (CurEnv->e_id != NULL) { - dropenvelope(CurEnv, true, false); + if (dropenvelope(CurEnv, true, false)) + /* exit with OS error if savemail panic'ed */ + exitstat = EX_OSERR; sm_rpool_free(CurEnv->e_rpool); CurEnv->e_rpool = NULL; diff -up sendmail-8.14.3/sendmail/sendmail.h.exitpanic sendmail-8.14.3/sendmail/sendmail.h --- sendmail-8.14.3/sendmail/sendmail.h.exitpanic 2008-02-16 00:19:58.000000000 +0100 +++ sendmail-8.14.3/sendmail/sendmail.h 2009-12-15 13:55:52.000000000 +0100 @@ -982,7 +982,7 @@ extern ENVELOPE BlankEnvelope; /* functions */ extern void clearenvelope __P((ENVELOPE *, bool, SM_RPOOL_T *)); -extern void dropenvelope __P((ENVELOPE *, bool, bool)); +extern bool dropenvelope __P((ENVELOPE *, bool, bool)); extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *, SM_RPOOL_T *)); extern void clrsessenvelope __P((ENVELOPE *)); extern void printenvflags __P((ENVELOPE *));