[net.bugs.4bsd] 4.1a BSD longjmp

mjb (03/11/83)

We found a bug in the new, improved longjmp() which we received with our
4.1a BSD release. A 'beql' should be changed to a 'bneq' as shown in the
code fragment below (from /usr/src/libc/sys/setjmp.s):

# @(#)setjmp.s	4.2 (Berkeley) 81/07/10
	.
	.
_longjmp:
	.word	0x0000
	movl	8(ap),r0		# return(v)
#####	beql	L1			# REMOVE THIS
	bneq	L1			# ADD THIS
	movzbl	$1,r0
L1:
	.
	.
The effect of the distributed code was to return 0 instead of 1 at the
setjmp(jbuf) when you did a longjmp(jbuf,0) or (I'll admit to doing this,
but not on purpose!) longjmp(jbuf), and to return 1 instead of N for
longjmp(jbuf,N) for N != 0.

Mike Braca, Brown CS, ..!decvax!brunix!mjb, mjb.brown@udel-relay

PS: In case anyone is wondering in what way the longjmp is "new and improved",
    what it does is instead of just blindly rewinding the stack like the old
    one does, it pops the stack frame by frame, in order to write out
    'longjmp botch', then execute an illegal instruction (instead of just
    leaving garbage in your registers), when you do something tricky like a
    longjmp() with no previous setjmp().