Fix for 687461, C stack overflow quetly quits

Alex Cherepanov <[email protected]> Fri, 06 Aug 2004 00:50:26 -0400
Newsgroups gmane.comp.printing.ghostscript.patches
Organization Coscript Software
Message-ID <[email protected]>
Catch and report C stack overflow. By default the MSVC program just
silently dies.
Fix bug 687461

_______________________________________________
gs-code-review mailing list
[email protected]
http://www.ghostscript.com/mailman/listinfo/gs-code-review
stack.diff (text/plain, 1.7 KB)
Index: gs/src/dwmain.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/dwmain.c,v
retrieving revision 1.18
diff -b -u -r1.18 dwmain.c
--- gs/src/dwmain.c	7 Jul 2004 09:33:19 -0000	1.18
+++ gs/src/dwmain.c	6 Aug 2004 04:38:04 -0000
@@ -328,12 +328,17 @@
     nargv[2] = ddpi;
     memcpy(&nargv[3], &argv[1], argc * sizeof(char *));
 
+    __try {
     code = gsdll.init_with_args(instance, nargc, nargv);
     if (code == 0)
 	code = gsdll.run_string(instance, start_string, 0, &exit_code);
     code1 = gsdll.exit(instance);
     if (code == 0 || (code == e_Quit && code1 != 0))
 	code = code1;
+    } __except(_exception_code() == EXCEPTION_STACK_OVERFLOW) {
+        code = e_Fatal;
+        text_puts(tw, "*** C stack overflow. Quiting...\n");
+    }
 
     gsdll.delete_instance(instance);
 
Index: gs/src/dwmainc.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/dwmainc.c,v
retrieving revision 1.20
diff -b -u -r1.20 dwmainc.c
--- gs/src/dwmainc.c	7 Jul 2004 09:33:19 -0000	1.20
+++ gs/src/dwmainc.c	6 Aug 2004 04:38:04 -0000
@@ -407,12 +407,17 @@
     nargv[2] = ddpi;
     memcpy(&nargv[3], &argv[1], argc * sizeof(char *));
 
+    __try {
     code = gsdll.init_with_args(instance, nargc, nargv);
     if (code == 0)
 	code = gsdll.run_string(instance, start_string, 0, &exit_code);
     code1 = gsdll.exit(instance);
     if (code == 0 || (code == e_Quit && code1 != 0))
 	code = code1;
+    } __except(_exception_code() == EXCEPTION_STACK_OVERFLOW) {
+        code = e_Fatal;
+        fprintf(stderr, "*** C stack overflow. Quiting...\n");
+    }
 
     gsdll.delete_instance(instance);