From 2cdce8d1aac1e2bf96016a7ccd51071c0e8f4767 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 27 May 2005 04:37:07 +0000 Subject: r7004: added support for exceptions generated in the esp library. If the OS supports setjmp/longjmp then the exception will generate a error in the web page and the Samba log. If the OS doesn't support setjmp then we will abort. (This used to be commit 2614ace175a51cfb4b1e0e3ca3db405a19f7ab18) --- source4/web_server/config.m4 | 1 + source4/web_server/ejs/miniMpr.c | 8 ++++---- source4/web_server/http.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 source4/web_server/config.m4 (limited to 'source4/web_server') diff --git a/source4/web_server/config.m4 b/source4/web_server/config.m4 new file mode 100644 index 0000000000..4d8952b775 --- /dev/null +++ b/source4/web_server/config.m4 @@ -0,0 +1 @@ +AC_CHECK_HEADERS(setjmp.h) diff --git a/source4/web_server/ejs/miniMpr.c b/source4/web_server/ejs/miniMpr.c index 46d9579c7e..8e1689ac9d 100644 --- a/source4/web_server/ejs/miniMpr.c +++ b/source4/web_server/ejs/miniMpr.c @@ -160,10 +160,10 @@ void mprLog(int level, const char *fmt, ...) void mprBreakpoint(const char *file, int line, const char *cond) { - /* - * Optionally break into the debugger here - */ - mprLog(0, "ASSERT at %s:%d, %s\n", file, line, cond); + char *buf; + mprAllocSprintf(&buf, MPR_MAX_STRING, "esp exception - ASSERT at %s:%d, %s\n", + file, line, cond); + http_exception(buf); } #endif /* !BLD_GOAHEAD_WEBSERVER */ diff --git a/source4/web_server/http.c b/source4/web_server/http.c index d9d441f765..6687ab7d16 100644 --- a/source4/web_server/http.c +++ b/source4/web_server/http.c @@ -455,6 +455,28 @@ static void http_setup_arrays(struct esp_state *esp) SETVAR(ESP_REQUEST_OBJ, "SCRIPT_FILENAME", web->input.url); } +#if HAVE_SETJMP_H +/* the esp scripting lirary generates exceptions when + it hits a major error. We need to catch these and + report a internal server error via http +*/ +#include +static jmp_buf http_exception_buf; +static const char *exception_reason; + +void http_exception(const char *reason) +{ + exception_reason = reason; + DEBUG(0,("%s", reason)); + longjmp(http_exception_buf, -1); +} +#else +void http_exception(const char *reason) +{ + DEBUG(0,("%s", reason)); + smb_panic(reason); +} +#endif /* process a esp request @@ -474,6 +496,12 @@ static void esp_request(struct esp_state *esp) return; } +#if HAVE_SETJMP_H + if (setjmp(http_exception_buf) != 0) { + http_error(web, 500, exception_reason); + return; + } +#endif res = espProcessRequest(esp->req, url, buf, &emsg); if (res != 0 && emsg) { http_writeBlock(web, emsg, strlen(emsg)); -- cgit