[cmucl-commit] CMUCL commit: src (code/seq.lisp general-info/release-20c.txt)

Raymond Toy rtoy at common-lisp.net
Thu Dec 9 06:13:51 CET 2010


    Date: Thursday, December 9, 2010 @ 00:13:51
  Author: rtoy
    Path: /project/cmucl/cvsroot/src

Modified: code/seq.lisp general-info/release-20c.txt

SUBSEQ was sometimes crashing lisp when the end index was less than
the start.  This was due to one of two things:  The result sequence
was created with a negative length, creating invalid objects, or
accessing the invalid object would cause a segfault.

code/seq.lisp:
o Declare the type of LENGTH in MAKE-SEQUENCE-OF-TYPE better.  It's
  not a fixnum, but an index (non-negative fixnum).  This should catch
  any mistakes where we try to create sequences of negative length.
o Explicitly catch invalid START and END indices in VECTOR-SUBSEQ* and
  LIST-SUBSEQ* and signal an error

general-info/release-20c.txt:
o Document bugfix.


------------------------------+
 code/seq.lisp                |    8 ++++++--
 general-info/release-20c.txt |    3 +++
 2 files changed, 9 insertions(+), 2 deletions(-)


Index: src/code/seq.lisp
diff -u src/code/seq.lisp:1.58 src/code/seq.lisp:1.59
--- src/code/seq.lisp:1.58	Tue Apr 20 13:57:45 2010
+++ src/code/seq.lisp	Thu Dec  9 00:13:50 2010
@@ -5,7 +5,7 @@
 ;;; Carnegie Mellon University, and has been placed in the public domain.
 ;;;
 (ext:file-comment
-  "$Header: /project/cmucl/cvsroot/src/code/seq.lisp,v 1.58 2010-04-20 17:57:45 rtoy Rel $")
+  "$Header: /project/cmucl/cvsroot/src/code/seq.lisp,v 1.59 2010-12-09 05:13:50 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -124,7 +124,7 @@
 
 (defun make-sequence-of-type (type length)
   "Returns a sequence of the given TYPE and LENGTH."
-  (declare (fixnum length))
+  (declare (type index length))
   (case (type-specifier-atom type)
     (list (make-list length))
     ((bit-vector simple-bit-vector) (make-array length :element-type '(mod 2)))
@@ -285,6 +285,8 @@
 (defun vector-subseq* (sequence start &optional end)
   (declare (vector sequence) (fixnum start))
   (when (null end) (setf end (length sequence)))
+  (unless (<= start end)
+    (error "Illegal bounding indices:  ~S ~S" start end))
   (do ((old-index start (1+ old-index))
        (new-index 0 (1+ new-index))
        (copy (make-sequence-like sequence (- end start))))
@@ -294,6 +296,8 @@
 
 (defun list-subseq* (sequence start &optional end)
   (declare (list sequence) (fixnum start))
+  (when (and end (> start (the fixnum end)))
+    (error "Illegal bounding indices:  ~S ~S" start end))
   (if (and end (>= start (the fixnum end)))
       ()
       (let* ((groveled (nthcdr start sequence))
Index: src/general-info/release-20c.txt
diff -u src/general-info/release-20c.txt:1.13 src/general-info/release-20c.txt:1.14
--- src/general-info/release-20c.txt:1.13	Thu Dec  2 09:26:45 2010
+++ src/general-info/release-20c.txt	Thu Dec  9 00:13:50 2010
@@ -85,6 +85,9 @@
     - FORMAT signals an warning if ~:; is used inside ~:[.
     - SET-SYSTEM-EXTERNAL-FORMAT was not actually setting the filename
       encoding if given.
+    - SUBSEQ with an end index less than the start index sometimes
+      crashes CMUCL. Now, signal an error if the boudns are not
+      valid. 
  
   * Trac Tickets:
 


More information about the cmucl-commit mailing list