From: Guillermo J. Rozas <edu/mit/csail/zurich/gjr>
Date: Wed, 23 Mar 1988 18:45:39 +0000 (+0000)
Subject: Add some overflow checking in entity apply code.  It will not work in
X-Git-Tag: 20090517-FFI~12852
X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=bf33c410794a28935302c62d8f9028b261288e47;p=mit-scheme.git

Add some overflow checking in entity apply code.  It will not work in
fscheme/multischeme, but figuring out what the right thing to do there
is not easy.
---

diff --git a/v7/src/microcode/interp.c b/v7/src/microcode/interp.c
index 0ce0040a5..2c88b5463 100644
--- a/v7/src/microcode/interp.c
+++ b/v7/src/microcode/interp.c
@@ -30,7 +30,7 @@ Technology nor of any adaptation thereof in any advertising,
 promotional, or sales literature without prior written consent from
 MIT in each case. */
 
-/* $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/interp.c,v 9.42 1988/03/23 18:31:25 jrm Exp $
+/* $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/interp.c,v 9.43 1988/03/23 18:45:39 jinx Rel $
  *
  * This file contains the heart of the Scheme Scode
  * interpreter
@@ -1375,11 +1375,19 @@ Perform_Application:
 	    /* This code assumes that adding 1 to nargs takes care
 	       of everything, including type code, etc.
 	     */
+
 	    nargs = Pop();
 	    Push(Fast_Vector_Ref(Function, ENTITY_OPERATOR));
 	    Push(nargs + 1);
-	    /* No interrupts, etc. */
-	    goto Apply_Non_Trapping;
+	    /* This must be done to prevent an infinite push loop by
+	       an entity whose handler is the entity itself or some
+	       other such loop.  Of course, it will die if stack overflow
+	       interrupts are disabled.
+	       This will not work in fscheme!  It has to be thought out
+	       carefully.
+	     */
+	    Stack_Check(Stack_Pointer);
+	    goto Internal_Apply;
 	  }
 
 /* Interpret() continues on the next page */
diff --git a/v8/src/microcode/interp.c b/v8/src/microcode/interp.c
index c542948f8..047d32f08 100644
--- a/v8/src/microcode/interp.c
+++ b/v8/src/microcode/interp.c
@@ -30,7 +30,7 @@ Technology nor of any adaptation thereof in any advertising,
 promotional, or sales literature without prior written consent from
 MIT in each case. */
 
-/* $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/microcode/interp.c,v 9.42 1988/03/23 18:31:25 jrm Exp $
+/* $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/microcode/interp.c,v 9.43 1988/03/23 18:45:39 jinx Rel $
  *
  * This file contains the heart of the Scheme Scode
  * interpreter
@@ -1375,11 +1375,19 @@ Perform_Application:
 	    /* This code assumes that adding 1 to nargs takes care
 	       of everything, including type code, etc.
 	     */
+
 	    nargs = Pop();
 	    Push(Fast_Vector_Ref(Function, ENTITY_OPERATOR));
 	    Push(nargs + 1);
-	    /* No interrupts, etc. */
-	    goto Apply_Non_Trapping;
+	    /* This must be done to prevent an infinite push loop by
+	       an entity whose handler is the entity itself or some
+	       other such loop.  Of course, it will die if stack overflow
+	       interrupts are disabled.
+	       This will not work in fscheme!  It has to be thought out
+	       carefully.
+	     */
+	    Stack_Check(Stack_Pointer);
+	    goto Internal_Apply;
 	  }
 
 /* Interpret() continues on the next page */