Commit fe3d8d4d authored by Rob Pike's avatar Rob Pike

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/13461Reviewed-by: default avatarAndrew Gerrand <adg@golang.org>
parent e7f4df73
...@@ -888,7 +888,6 @@ func hexDigit(d rune) (int, bool) { ...@@ -888,7 +888,6 @@ func hexDigit(d rune) (int, bool) {
func (s *ss) hexByte() (b byte, ok bool) { func (s *ss) hexByte() (b byte, ok bool) {
rune1 := s.getRune() rune1 := s.getRune()
if rune1 == eof { if rune1 == eof {
s.UnreadRune()
return return
} }
value1, ok := hexDigit(rune1) value1, ok := hexDigit(rune1)
......
...@@ -1128,3 +1128,31 @@ func TestScanfNewlineMatchFormat(t *testing.T) { ...@@ -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)
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment