summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-05-27 04:37:07 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:17:05 -0500
commit2cdce8d1aac1e2bf96016a7ccd51071c0e8f4767 (patch)
tree58689e81c9fa8c092d720d11ab5e33dd3203d38c
parentda817b1550c64dbfa581514169637a68b0bc2499 (diff)
downloadsamba-2cdce8d1aac1e2bf96016a7ccd51071c0e8f4767.tar.gz
samba-2cdce8d1aac1e2bf96016a7ccd51071c0e8f4767.tar.bz2
samba-2cdce8d1aac1e2bf96016a7ccd51071c0e8f4767.zip
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)
-rw-r--r--source4/configure.in1
-rw-r--r--source4/web_server/config.m41
-rw-r--r--source4/web_server/ejs/miniMpr.c8
-rw-r--r--source4/web_server/http.c28
4 files changed, 34 insertions, 4 deletions
diff --git a/source4/configure.in b/source4/configure.in
index 68fddc99db..370d1281c6 100644
--- a/source4/configure.in
+++ b/source4/configure.in
@@ -28,6 +28,7 @@ SMB_INCLUDE_M4(scripting/config.m4)
SMB_INCLUDE_M4(gtk/config.m4)
SMB_INCLUDE_M4(ntvfs/posix/config.m4)
SMB_INCLUDE_M4(lib/socket_wrapper/config.m4)
+SMB_INCLUDE_M4(web_server/config.m4)
ALLLIBS_LIBS="$LIBS"
ALLLIBS_CFLAGS="$CFLAGS"
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 <setjmp.h>
+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));