Bug 3674 - strtod trailing zero removal doesn't allow for hex floats
Summary: strtod trailing zero removal doesn't allow for hex floats
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: libc (show other bugs)
Version: 2.4
: P2 normal
Target Milestone: ---
Assignee: Ulrich Drepper
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-12-07 04:57 UTC by Joseph Myers
Modified: 2014-07-17 14:55 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Joseph Myers 2006-12-07 04:57:00 UTC
The strtod removal of trailing 0s from the integer part with a negative exponent
doesn't adjust the exponent correctly (by 4) for each 0 removed from a hex number.

  if (dig_no == int_no && dig_no > 0 && exponent < 0)
    do
      {
        while (! (base == 16 ? ISXDIGIT (expp[-1]) : ISDIGIT (expp[-1])))
          --expp;

        if (expp[-1] != L_('0'))
          break;

        --expp;
        --dig_no;
        --int_no;
        ++exponent;
      }
    while (dig_no > 0 && exponent < 0);

Testcase:

#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
  printf("%g\n", atof("0x10p-1"));
  return 0;
}

prints 1 but should print 8.
Comment 1 Ulrich Drepper 2006-12-10 00:03:38 UTC
Fixed in cvs.
Comment 2 Sourceware Commits 2007-01-12 18:07:38 UTC
Subject: Bug 3674

CVSROOT:	/cvs/glibc
Module name:	libc
Branch: 	glibc-2_5-branch
Changes by:	jakub@sourceware.org	2007-01-12 18:07:19

Modified files:
	.              : ChangeLog 
	stdlib         : Makefile strtod_l.c 
Added files:
	stdlib         : tst-atof1.c tst-atof2.c tst-strtod2.c 
	                 tst-strtod3.c 

Log message:
	* stdlib/Makefile (tst-strtod3-ENV): Define.
	
	* stdlib/strtod_l.c (____STRTOF_INTERNAL): Parse thousand
	separators also if no non-zero digits found.
	* stdlib/Makefile (tests): Add tst-strtod3.
	
	[BZ #3664]
	* stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix test to recognize
	empty parsed strings.
	* stdlib/Makefile (tests): Add tst-strtod2.
	* stdlib/tst-strtod2.c: New file.
	
	[BZ #3673]
	* stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix exp_limit
	computation.
	* stdlib/Makefile (tests): Add tst-atof2.
	* stdlib/tst-atof2.c: New file.
	
	[BZ #3674]
	* stdlib/strtod_l.c (____STRTOF_INTERNAL): Adjust exponent value
	correctly if removing trailing zero of hex-float.
	* stdlib/Makefile (tests): Add tst-atof1.
	* stdlib/tst-atof1.c: New file.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/ChangeLog.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.10362.2.28&r2=1.10362.2.29
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-atof1.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-atof2.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-strtod2.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.3.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-strtod3.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/Makefile.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.109.2.2&r2=1.109.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/strtod_l.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.14&r2=1.14.2.1