httpd: fix CGI handling bug (we were closing wrong fd).
[oweals/busybox.git] / libbb / error_msg_and_die.c
index 7e73937739c0610e739662904be1da55e73dcc49..0e99a03cfa96ce204a751f35fdf4cdd096f71669 100644 (file)
@@ -2,46 +2,46 @@
 /*
  * Utility routines.
  *
- * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
+ * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
 #include "libbb.h"
 
-extern void bb_error_msg_and_die(const char *s, ...)
+int die_sleep;
+#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_HUSH
+jmp_buf die_jmp;
+#endif
+
+void xfunc_die(void)
+{
+       if (die_sleep) {
+               if ((ENABLE_FEATURE_PREFER_APPLETS || ENABLE_HUSH)
+                && die_sleep < 0
+               ) {
+                       /* Special case. We arrive here if NOFORK applet
+                        * calls xfunc, which then decides to die.
+                        * We don't die, but jump instead back to caller.
+                        * NOFORK applets still cannot carelessly call xfuncs:
+                        * p = xmalloc(10);
+                        * q = xmalloc(10); // BUG! if this dies, we leak p!
+                        */
+                       /* -2222 means "zero" (longjmp can't pass 0)
+                        * run_nofork_applet() catches -2222. */
+                       longjmp(die_jmp, xfunc_error_retval ? xfunc_error_retval : -2222);
+               }
+               sleep(die_sleep);
+       }
+       exit(xfunc_error_retval);
+}
+
+void bb_error_msg_and_die(const char *s, ...)
 {
        va_list p;
 
        va_start(p, s);
-       bb_verror_msg(s, p);
+       bb_verror_msg(s, p, NULL);
        va_end(p);
-       putc('\n', stderr);
-       exit(bb_default_error_retval);
+       xfunc_die();
 }
-
-
-/* END CODE */
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/