diff options
author | das <das@FreeBSD.org> | 2004-01-31 23:16:09 +0000 |
---|---|---|
committer | das <das@FreeBSD.org> | 2004-01-31 23:16:09 +0000 |
commit | f042400fb5e8891dbb1c99b58015fd71e22d9cb5 (patch) | |
tree | f6a61d0c8b46b5a894d75d341e48c86f111732cd /lib/libc/stdio/vfscanf.c | |
parent | 7a868d64815ec98c25a1de0d2bfe48b04ec0e3a8 (diff) | |
download | FreeBSD-src-f042400fb5e8891dbb1c99b58015fd71e22d9cb5.zip FreeBSD-src-f042400fb5e8891dbb1c99b58015fd71e22d9cb5.tar.gz |
Fix the handling of negative hexadecimal numbers in integer formats.
Note that this bug is unrelated to recent work in this area; it seems
to have been present since revision 1.1.
Obtained from: NetBSD
Diffstat (limited to 'lib/libc/stdio/vfscanf.c')
-rw-r--r-- | lib/libc/stdio/vfscanf.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/libc/stdio/vfscanf.c b/lib/libc/stdio/vfscanf.c index a6c8d0e..dabf16e 100644 --- a/lib/libc/stdio/vfscanf.c +++ b/lib/libc/stdio/vfscanf.c @@ -88,6 +88,7 @@ __FBSDID("$FreeBSD$"); #define NDIGITS 0x80 /* no digits detected */ #define PFXOK 0x100 /* 0x prefix is (still) legal */ #define NZDIGITS 0x200 /* no zero digits detected */ +#define HAVESIGN 0x10000 /* sign detected */ /* * Conversion types. @@ -679,13 +680,18 @@ literal: case '+': case '-': if (flags & SIGNOK) { flags &= ~SIGNOK; + flags |= HAVESIGN; goto ok; } break; - - /* x ok iff flag still set & 2nd char */ + + /* + * x ok iff flag still set & 2nd char (or + * 3rd char if we have a sign). + */ case 'x': case 'X': - if (flags & PFXOK && p == buf + 1) { + if (flags & PFXOK && p == + buf + 1 + !!(flags & HAVESIGN)) { base = 16; /* if %i */ flags &= ~PFXOK; goto ok; |