[net.sources.bugs] xlisp bug

ron@trsvax.UUCP (02/07/85)

The new posting of XLISP hangs forever when trying to load 'pt.lsp' on
a vax 780 under BSD 4.1.  In the routine 'gc', there is a "for" loop
that keeps going over and over the same nodes to mark and never exits. 
Interestingly enough, this problem does not show up if the program is
hand typed, just if loaded in from the file.

	         .... memo from the desk of Ron Light
		                    Fort Worth, Texas
          ... {ctvax,microsoft,ihnp4!sys1}!trsvax!ron
	          ... cu-arpa.trsvax!ron@Cornell.ARPA

jgpo@ihu1e.UUCP (John, KA9MNK) (02/16/85)

> The new posting of XLISP hangs forever when trying to load 'pt.lsp' on
> a vax 780 under BSD 4.1.  In the routine 'gc', there is a "for" loop
> that keeps going over and over the same nodes to mark and never exits. 
> Interestingly enough, this problem does not show up if the program is
> hand typed, just if loaded in from the file.
> 
> 	         .... memo from the desk of Ron Light
> 		                    Fort Worth, Texas
>           ... {ctvax,microsoft,ihnp4!sys1}!trsvax!ron
> 	          ... cu-arpa.trsvax!ron@Cornell.ARPA



The bug is in the xlload() routine in xlread.c.  The source (beginning at
line 44) currently reads:


	/* open the file */
	if ((fp = fopen(fname,"r")) == NULL)
	    return (FALSE);



Change this to:


	/* open the file */
	if ((fp = fopen(fname,"r")) == NULL)
	{
	    xlstack = oldstk;
	    return (FALSE);
	}




			John Opalko
			AT&T Bell Labs
			Naperville, IL
			...!ihnp4!ihu1e!jgpo

mark@digi-g.UUCP (Mark Mendel) (04/03/85)

The consists of contexts not being popped when a throw occurs!
This occurs, for instance, when an error occurs within a non-error cathing
context, like a tagblock:

	(prog () (*unbound*))

causes core dumps.

The fix:

*** xljump.c	Tue Apr  2 14:52:44 1985
--- =orig/xljump.c	Thu Mar 21 09:41:51 1985
***************
*** 39,45
      xlunbind(cptr->c_xlenv);
      xlnewenv = cptr->c_xlnewenv;
      xltrace = cptr->c_xltrace;
-     xlcontext = cptr;
  
      /* call the handler */
      longjmp(cptr->c_jmpbuf,type);

--- 39,44 -----
      xlunbind(cptr->c_xlenv);
      xlnewenv = cptr->c_xlnewenv;
      xltrace = cptr->c_xltrace;
  
      /* call the handler */
      longjmp(cptr->c_jmpbuf,type);