From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.bugs Subject: bug#32476: 27.0.50; Assertion failure for dot-terminated large int Date: Tue, 21 Aug 2018 15:52:38 -0700 Organization: UCLA Computer Science Department Message-ID: <098c494b-4b76-45e6-376d-ed8ae1d19222@cs.ucla.edu> References: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------B4DD5C864F20B851510BE3CB" X-Trace: blaine.gmane.org 1534891875 4213 195.159.176.226 (21 Aug 2018 22:51:15 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 21 Aug 2018 22:51:15 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 Cc: 32476-done@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Aug 22 00:51:10 2018 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fsFUT-00010o-Mh for geb-bug-gnu-emacs@m.gmane.org; Wed, 22 Aug 2018 00:51:09 +0200 Original-Received: from localhost ([::1]:56182 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fsFWa-0001dc-AV for geb-bug-gnu-emacs@m.gmane.org; Tue, 21 Aug 2018 18:53:20 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41330) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fsFWU-0001dI-4O for bug-gnu-emacs@gnu.org; Tue, 21 Aug 2018 18:53:15 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fsFWN-0003Ep-GB for bug-gnu-emacs@gnu.org; Tue, 21 Aug 2018 18:53:13 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:52105) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fsFWI-0003Dn-9U for bug-gnu-emacs@gnu.org; Tue, 21 Aug 2018 18:53:05 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1fsFWH-0001D8-Vl for bug-gnu-emacs@gnu.org; Tue, 21 Aug 2018 18:53:02 -0400 In-Reply-To: Resent-From: Paul Eggert Original-Sender: "Debbugs-submit" Resent-To: bug-gnu-emacs@gnu.org Resent-Date: Tue, 21 Aug 2018 22:53:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: cc-closed 32476 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Mail-Followup-To: 32476@debbugs.gnu.org, eggert@cs.ucla.edu, monnier@IRO.UMontreal.CA Original-Received: via spool by 32476-done@debbugs.gnu.org id=D32476.15348919694632 (code D ref 32476); Tue, 21 Aug 2018 22:53:01 +0000 Original-Received: (at 32476-done) by debbugs.gnu.org; 21 Aug 2018 22:52:49 +0000 Original-Received: from localhost ([127.0.0.1]:57122 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fsFW5-0001Ce-1S for submit@debbugs.gnu.org; Tue, 21 Aug 2018 18:52:49 -0400 Original-Received: from zimbra.cs.ucla.edu ([131.179.128.68]:33670) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fsFW2-0001CQ-RF for 32476-done@debbugs.gnu.org; Tue, 21 Aug 2018 18:52:47 -0400 Original-Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id 6717F160192; Tue, 21 Aug 2018 15:52:40 -0700 (PDT) Original-Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id 5ZUuwyzEze7y; Tue, 21 Aug 2018 15:52:39 -0700 (PDT) Original-Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id 87EE61605B1; Tue, 21 Aug 2018 15:52:39 -0700 (PDT) X-Virus-Scanned: amavisd-new at zimbra.cs.ucla.edu Original-Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id RP92T2_qRwpN; Tue, 21 Aug 2018 15:52:39 -0700 (PDT) Original-Received: from [192.168.1.9] (unknown [47.154.30.119]) by zimbra.cs.ucla.edu (Postfix) with ESMTPSA id 455DE160192; Tue, 21 Aug 2018 15:52:39 -0700 (PDT) Content-Language: en-US X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:149652 Archived-At: This is a multi-part message in MIME format. --------------B4DD5C864F20B851510BE3CB Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Thanks for reporting that; I installed the attached to fix it. --------------B4DD5C864F20B851510BE3CB Content-Type: text/x-patch; name="0001-Fix-assertion-failure-when-reading-BIGNUM.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-Fix-assertion-failure-when-reading-BIGNUM.patch" >From f8069952abf147d090032ad6b941a728cad2c496 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 21 Aug 2018 15:49:01 -0700 Subject: [PATCH] Fix assertion failure when reading 'BIGNUM.' Problem reported by Stefan Monnier (Bug#32476). * src/lread.c (string_to_number): Don't pass leading "+" or trailing "." or junk to make_bignum_str. * test/src/lread-tests.el (lread-string-to-number-trailing-dot): New test. --- src/lread.c | 21 ++++++++++++++++----- test/src/lread-tests.el | 9 +++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/lread.c b/src/lread.c index df2fe58120..5e1bd419fa 100644 --- a/src/lread.c +++ b/src/lread.c @@ -3710,8 +3710,9 @@ string_to_number (char const *string, int base, int flags) IEEE floating point hosts, and works around a formerly-common bug where atof ("-0.0") drops the sign. */ bool negative = *cp == '-'; + bool positive = *cp == '+'; - bool signedp = negative || *cp == '+'; + bool signedp = negative | positive; cp += signedp; enum { INTOVERFLOW = 1, LEAD_INT = 2, DOT_CHAR = 4, TRAIL_INT = 8, @@ -3732,6 +3733,7 @@ string_to_number (char const *string, int base, int flags) n += digit; } } + char const *after_digits = cp; if (*cp == '.') { state |= DOT_CHAR; @@ -3807,10 +3809,19 @@ string_to_number (char const *string, int base, int flags) return make_fixnum (negative ? -signed_n : signed_n); } - /* Skip a leading "+". */ - if (signedp && !negative) - ++string; - return make_bignum_str (string, base); + /* Trim any leading "+" and trailing nondigits, then convert to + bignum. */ + string += positive; + if (!*after_digits) + return make_bignum_str (string, base); + ptrdiff_t trimmed_len = after_digits - string; + USE_SAFE_ALLOCA; + char *trimmed = SAFE_ALLOCA (trimmed_len + 1); + memcpy (trimmed, string, trimmed_len); + trimmed[trimmed_len] = '\0'; + Lisp_Object result = make_bignum_str (trimmed, base); + SAFE_FREE (); + return result; } /* Either the number uses float syntax, or it does not fit into a fixnum. diff --git a/test/src/lread-tests.el b/test/src/lread-tests.el index 17381340c7..f19d98320a 100644 --- a/test/src/lread-tests.el +++ b/test/src/lread-tests.el @@ -209,4 +209,13 @@ lread-tests--last-message (should-error (let ((load-force-doc-strings t)) (read "#[0 \"\"]")))) +(ert-deftest lread-string-to-number-trailing-dot () + (dolist (n (list (* most-negative-fixnum most-negative-fixnum) + (1- most-negative-fixnum) most-negative-fixnum + (1+ most-negative-fixnum) -1 0 1 + (1- most-positive-fixnum) most-positive-fixnum + (1+ most-positive-fixnum) + (* most-positive-fixnum most-positive-fixnum))) + (should (= n (string-to-number (format "%d." n)))))) + ;;; lread-tests.el ends here -- 2.17.1 --------------B4DD5C864F20B851510BE3CB--