From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28406 invoked by alias); 13 Apr 2007 14:20:25 -0000 Received: (qmail 28144 invoked by uid 22791); 13 Apr 2007 14:20:21 -0000 X-Spam-Check-By: sourceware.org Received: from sunsite.ms.mff.cuni.cz (HELO sunsite.mff.cuni.cz) (195.113.15.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 13 Apr 2007 15:20:15 +0100 Received: from sunsite.mff.cuni.cz (localhost.localdomain [127.0.0.1]) by sunsite.mff.cuni.cz (8.13.8/8.13.8) with ESMTP id l3DEO2vX002420; Fri, 13 Apr 2007 16:24:02 +0200 Received: (from jakub@localhost) by sunsite.mff.cuni.cz (8.13.8/8.13.8/Submit) id l3DEO2rl002415; Fri, 13 Apr 2007 16:24:02 +0200 Date: Fri, 13 Apr 2007 14:20:00 -0000 From: Jakub Jelinek To: Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] Fix BZ#4070 special case Message-ID: <20070413142401.GG1826@sunsite.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.2i Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2007-04/txt/msg00005.txt.bz2 Hi! When !info->alt, trailing zeros are removed and decimal point as well. So for a number which has exponent -5 initially, but rounds to 0.0001, we have L"1.0000..." at wstartp and wcp == wstartp + 1 (as even the decimal point was eaten). This results either in an assertion failure or with -DNDEBUG=1 in wmemset with -1L as last argument (thus likely a segfault). 2007-04-13 Jakub Jelinek * stdio-common/printf_fp.c (___printf_fp): Fix exponent -4 special case handling when wcp == wstartp + 1. Fix a comment typo. * stdio-common/tfformat.c (sprint_doubles): Add a new testcase. --- libc/stdio-common/printf_fp.c.jj 2007-02-26 18:13:47.000000000 +0100 +++ libc/stdio-common/printf_fp.c 2007-04-13 16:03:38.000000000 +0200 @@ -990,7 +990,7 @@ ___printf_fp (FILE *fp, 0)) /* This is a special case: the rounded number is 1.0, the format is 'g' or 'G', and the alternative format - is selected. This means the result mist be "1.". */ + is selected. This means the result must be "1.". */ --added_zeros; } @@ -1081,12 +1081,17 @@ ___printf_fp (FILE *fp, /* This is another special case. The exponent of the number is really smaller than -4, which requires the 'e'/'E' format. But after rounding the number has an exponent of -4. */ - assert (wcp >= wstartp + 2); + assert (wcp >= wstartp + 1); assert (wstartp[0] == L'1'); __wmemcpy (wstartp, L"0.0001", 6); wstartp[1] = decimalwc; - wmemset (wstartp + 6, L'0', wcp - (wstartp + 2)); - wcp += 4; + if (wcp >= wstartp + 2) + { + wmemset (wstartp + 6, L'0', wcp - (wstartp + 2)); + wcp += 4; + } + else + wcp += 5; } else { --- libc/stdio-common/tfformat.c.jj 2007-02-26 18:13:47.000000000 +0100 +++ libc/stdio-common/tfformat.c 2007-04-13 15:52:53.000000000 +0200 @@ -4020,6 +4020,7 @@ sprint_double_type sprint_doubles[] = {__LINE__, 0.000956, "0.001", "%#.0g"}, {__LINE__, 0.000098, "0.0001", "%#.0g"}, {__LINE__, 0.0000996, "0.00010", "%#.2g"}, + {__LINE__, 9.999999999999999e-05, "0.0001", "%g"}, {0 } Jakub