Skip to content

Commit

Permalink
fmt: don't unread eof scanning %x
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
robpike committed Aug 10, 2015
1 parent e7f4df7 commit fe3d8d4
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
1 change: 0 additions & 1 deletion src/fmt/scan.go
Expand Up @@ -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)
Expand Down
28 changes: 28 additions & 0 deletions src/fmt/scan_test.go
Expand Up @@ -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)
}
}

0 comments on commit fe3d8d4

Please sign in to comment.