aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2015-08-10 13:21:28 +1000
committerRob Pike <r@golang.org>2015-08-10 03:34:48 +0000
commitfe3d8d4db04d0589177a7a2164dff46928129331 (patch)
tree00013929e40eb62d5c29f0da235eb9104df8ef6c
parente7f4df73320b5bea5d38191a9e3afc1ead43b91a (diff)
downloadgo-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.go1
-rw-r--r--src/fmt/scan_test.go28
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)
+ }
+}