diff options
author | Rob Pike <r@golang.org> | 2015-08-10 13:21:28 +1000 |
---|---|---|
committer | Rob Pike <r@golang.org> | 2015-08-10 03:34:48 +0000 |
commit | fe3d8d4db04d0589177a7a2164dff46928129331 (patch) | |
tree | 00013929e40eb62d5c29f0da235eb9104df8ef6c | |
parent | e7f4df73320b5bea5d38191a9e3afc1ead43b91a (diff) | |
download | go-fe3d8d4db04d0589177a7a2164dff46928129331.tar.gz go-fe3d8d4db04d0589177a7a2164dff46928129331.zip |
fmt: don't unread eof scanning %x
When scanning a hex byte at EOF, the code was ungetting the eof,
which backed up the input and caused double-scanning of a byte.
Delete the call to UnreadRune.
This line appeared in 1.5 for some reason; it was not in 1.4 and
should be removed again for 1.5
Fixes #12090.
Change-Id: Iad1ce8e7db8ec26615c5271310f4b0228cca7d78
Reviewed-on: https://go-review.googlesource.com/13461
Reviewed-by: Andrew Gerrand <adg@golang.org>
-rw-r--r-- | src/fmt/scan.go | 1 | ||||
-rw-r--r-- | src/fmt/scan_test.go | 28 |
2 files changed, 28 insertions, 1 deletions
diff --git a/src/fmt/scan.go b/src/fmt/scan.go index 21ed091d80..5b9b516353 100644 --- a/src/fmt/scan.go +++ b/src/fmt/scan.go @@ -888,7 +888,6 @@ func hexDigit(d rune) (int, bool) { func (s *ss) hexByte() (b byte, ok bool) { rune1 := s.getRune() if rune1 == eof { - s.UnreadRune() return } value1, ok := hexDigit(rune1) diff --git a/src/fmt/scan_test.go b/src/fmt/scan_test.go index 694f93e1ae..a3784364e6 100644 --- a/src/fmt/scan_test.go +++ b/src/fmt/scan_test.go @@ -1128,3 +1128,31 @@ func TestScanfNewlineMatchFormat(t *testing.T) { } } } + +// Test for issue 12090: Was unreading at EOF, double-scanning a byte. + +type hexBytes [2]byte + +func (h *hexBytes) Scan(ss ScanState, verb rune) error { + var b []byte + _, err := Fscanf(ss, "%4x", &b) + if err != nil { + panic(err) // Really shouldn't happen. + } + copy((*h)[:], b) + return err +} + +func TestHexByte(t *testing.T) { + var h hexBytes + n, err := Sscanln("0123\n", &h) + if err != nil { + t.Fatal(err) + } + if n != 1 { + t.Fatalf("expected 1 item; scanned %d", n) + } + if h[0] != 0x01 || h[1] != 0x23 { + t.Fatalf("expected 0123 got %x", h) + } +} |