From: Nikodemus S. <de...@us...> - 2007-06-28 14:24:55
|
Update of /cvsroot/sbcl/sbcl/src/compiler/x86 In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv28971/src/compiler/x86 Modified Files: debug.lisp Log Message: 1.0.7.2: fix potential GC errors due to bogus objects in backtraces Backtrace construction involves calling MAKE-LISP-OBJ on things we devoutly hope are tagged lisp pointers, but this is not always the case. When we fail to detect this, and a GC follows while the bogus object is at location visible to GC bad things will happen. (Pinning doesn't change anything, as the object still needs to be scavenged.) To fix this (mostly -- one can still construct bogus lisp-objects using MAKE-LISP-OBJ, it just takes more work / is less likely to happen by accident): * Rename MAKE-LISP-OBJ %MAKE-LISP-OBJ, and MAKE-VALID-LISP-OBJ MAKE-LISP-OBJ. * Add an optional ERRORP argument to the former MAKE-VALID-LISP-OBJ, defaulting to T. * Always use the function formerly known as MAKE-VALID-LISP-OBJ, passing in errorp=NIL when in doubt. * Improve the validation done on x86/x86-64: factor out the checking logic in possibly_valid_dynamic_space_pointer, and use it to implment valid_lisp_ponter_p. Could be done on other platforms as well, but better done by someone who can test the results... Adjust other code to suit: * MAP-ALLOCATED-OBJECTS uses %MAKE-LISP-OBJ for now, as the new MAKE-LISP-OBJ is too slow to use for groveling over the whole heap. (Though it does detect a bunch of bogus objects we're constructing in ROOM now, so the time would not be really wasted...) No test cases because I've been unable to construct one that calls MAKE-LISP-OBJ with bogus arguments while backtracing, but such backtraces have been seen in the wild. Index: debug.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/x86/debug.lisp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- debug.lisp 8 Apr 2007 15:25:39 -0000 1.10 +++ debug.lisp 28 Jun 2007 14:24:49 -0000 1.11 @@ -120,9 +120,9 @@ (:translate sb!di::fun-code-header) (:variant fun-pointer-lowtag)) -(define-vop (make-lisp-obj) +(define-vop (%make-lisp-obj) (:policy :fast-safe) - (:translate sb!di::make-lisp-obj) + (:translate %make-lisp-obj) (:args (value :scs (unsigned-reg unsigned-stack) :target result)) (:arg-types unsigned-num) (:results (result :scs (descriptor-reg) |