From 85da703991c1706e8db919732d77cdfc3cd7ecfe Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Tue, 5 Apr 2005 18:38:09 +0000 Subject: [PATCH] 2005-04-05 Dave Korn * libc/stdio/vfscanf.c (__svfscanf_r): If an error occurs processing something that looks like a "NaN", put back the characters processed. --- newlib/ChangeLog | 5 +++++ newlib/libc/stdio/vfscanf.c | 21 +++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index e42500fcc..0b3b33700 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2005-04-05 Dave Korn + + * libc/stdio/vfscanf.c (__svfscanf_r): If an error occurs processing + something that looks like a "NaN", put back the characters processed. + 2005-04-01 Corinna Vinschen * libc/stdlib/strtod.c (_strtod_r): Never change s00. diff --git a/newlib/libc/stdio/vfscanf.c b/newlib/libc/stdio/vfscanf.c index 621ea23aa..80c652aba 100644 --- a/newlib/libc/stdio/vfscanf.c +++ b/newlib/libc/stdio/vfscanf.c @@ -1111,7 +1111,24 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap), } if (zeroes) flags &= ~NDIGITS; - /* + /* We may have a 'N' or possibly even a 'Na' as the start of 'NaN', + only to run out of chars before it was complete (or having + encountered a non- matching char). So check here if we have an + outstanding nancount, and if so put back the chars we did + swallow and treat as a failed match. */ + if (nancount && nancount != 3) + { + /* Ok... what are we supposed to do in the event that the + __srefill call above was triggered in the middle of the partial + 'NaN' and so we can't put it all back? */ + while (nancount-- && (p > buf)) + { + ungetc (*(u_char *)--p, fp); + --nread; + } + goto match_failure; + } + /* * If no digits, might be missing exponent digits * (just give back the exponent) or might be missing * regular digits, but had sign and/or decimal point. @@ -1123,7 +1140,7 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap), /* no digits at all */ while (p > buf) { - ungetc (*(u_char *)-- p, fp); + ungetc (*(u_char *)--p, fp); --nread; } goto match_failure; -- 2.43.5