This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [pechtcha: Bug in scanf &Co (Was Re: Error message from antiwordsince upgrade to cygwin 1.5.10)]


I have checked in a patch. When the 0 was read, some flags were cleared, however, these flags should have been reset again when the x was found since the 0 was actually part of the hex prefix and not a digit.

-- Jeff J.

Christopher Faylor wrote:
----- Forwarded message from Igor Pechtchanski <pechtcha> -----

From: Igor Pechtchanski
To: cygwin
Cc: "Gerrit P. Haase"
Subject: Bug in scanf &Co (Was Re: Error message from antiword since upgrade to cygwin 1.5.10)
Date: Wed, 2 Jun 2004 14:04:33 -0400 (EDT)
In-Reply-To: <Pine.GSO.4.58.0406021327090.18478@slinky.cs.nyu.edu>

On Wed, 2 Jun 2004, Igor Pechtchanski wrote:


On Wed, 2 Jun 2004, Gerrit P. Haase wrote:

[snip]

Everything works ok with cygwin-1.5.9.  I'll try to recompile with
1.5.10 later, maybe that helps...

Gerrit

Try the attached patch. FWIW, it seems like there's a bug here, but sscanf used to mask it. Was there a change in the sscanf implementation since 1.5.9? Igor


Never mind.  This is a bug in the newlib scanf family implementation
(actually, in __svfscanf_r in libc/stdio/vfscanf.c) that causes it to read
strings of the form 0x0+ incorrectly.  Attached is a testcase that
demonstrates the bug.  I suspect the following change:

2004-04-21 J"orn Rennecke

        * libc/stdio/vfscanf.c (NNZDIGITS): New define.
        (__svfscanf_r): In integer conversions, leave out leading zeroes
        which are not part of a base prefix.
        Keep track of width truncation to fit into buf, not counting left-out
        zeroes against width till the truncation has been compensated for.

#include <stdlib.h>
#include <stdio.h>

int main(char ac, char *av[]) {
  const char *str1 = "0x1 0x0 0x3";
  const char *str2 = "0x1 0x2 0x3";
  unsigned int i,j,k;
  sscanf(str1, "%x %x %x", &i, &j, &k);
  printf("Values are: %x %x %x\n", i, j, k);
  sscanf(str2, "%x %x %x", &i, &j, &k);
  printf("Values are: %x %x %x\n", i, j, k);
}

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

----- End forwarded message -----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]