From 00c604f263874880cc55a000af884c55743d6441 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 14 Jun 2011 15:01:32 -0700 Subject: [PATCH] * fns.c (Flength): Don't overflow int when computing a list length. Use EMACS_INT, not int, to avoid unwanted truncation on 64-bit hosts. Check for QUIT every 1024 entries rather than every other entry; that's faster and is responsive enough. Report an error instead of overflowing an integer. --- src/ChangeLog | 6 ++++++ src/fns.c | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index dd61843bc8..5d70c56cc5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,11 @@ 2011-06-14 Paul Eggert + * fns.c (Flength): Don't overflow int when computing a list length. + Use EMACS_INT, not int, to avoid unwanted truncation on 64-bit hosts. + Check for QUIT every 1024 entries rather than every other entry; + that's faster and is responsive enough. Report an error instead of + overflowing an integer. + * alloc.c: Check that resized vectors' lengths fit in fixnums. (header_size, word_size): New constants. (allocate_vectorlike): Don't check size overflow here. diff --git a/src/fns.c b/src/fns.c index 333a75ac2b..7d5d1bd5d9 100644 --- a/src/fns.c +++ b/src/fns.c @@ -110,7 +110,6 @@ To get the number of bytes, use `string-bytes'. */) (register Lisp_Object sequence) { register Lisp_Object val; - register int i; if (STRINGP (sequence)) XSETFASTINT (val, SCHARS (sequence)); @@ -124,19 +123,20 @@ To get the number of bytes, use `string-bytes'. */) XSETFASTINT (val, ASIZE (sequence) & PSEUDOVECTOR_SIZE_MASK); else if (CONSP (sequence)) { - i = 0; - while (CONSP (sequence)) + EMACS_INT i = 0; + + do { - sequence = XCDR (sequence); ++i; - - if (!CONSP (sequence)) - break; - + if ((i & ((1 << 10) - 1)) == 0) + { + if (MOST_POSITIVE_FIXNUM < i) + error ("List too long"); + QUIT; + } sequence = XCDR (sequence); - ++i; - QUIT; } + while (CONSP (sequence)); CHECK_LIST_END (sequence, sequence); -- 2.20.1