From 18063d46868b28c7cac1e2a08f6f07c28f955b36 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Sat, 7 Aug 2010 10:02:04 +1000 Subject: [PATCH] fmt.Scan: empty strings are errors Fixes #1002. R=rsc CC=golang-dev https://golang.org/cl/1882046 --- src/pkg/fmt/scan.go | 14 ++++++++++---- src/pkg/fmt/scan_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/pkg/fmt/scan.go b/src/pkg/fmt/scan.go index fad7dbf5504..afbbeb39480 100644 --- a/src/pkg/fmt/scan.go +++ b/src/pkg/fmt/scan.go @@ -598,18 +598,24 @@ func (s *ss) scanComplex(verb int, n int) complex128 { // convertString returns the string represented by the next input characters. // The format of the input is determined by the verb. -func (s *ss) convertString(verb int) string { +func (s *ss) convertString(verb int) (str string) { if !s.okVerb(verb, "svqx", "string") { return "" } s.skipSpace(false) switch verb { case 'q': - return s.quotedString() + str = s.quotedString() case 'x': - return s.hexString() + str = s.hexString() + default: + str = s.token() // %s and %v just return the next word } - return s.token() // %s and %v just return the next word + // Empty strings other than with %q are not OK. + if len(str) == 0 && verb != 'q' && s.maxWid > 0 { + s.errorString("Scan: no data for string") + } + return } // quotedString returns the double- or back-quoted string represented by the next input characters. diff --git a/src/pkg/fmt/scan_test.go b/src/pkg/fmt/scan_test.go index 05112438d5f..90927898978 100644 --- a/src/pkg/fmt/scan_test.go +++ b/src/pkg/fmt/scan_test.go @@ -464,6 +464,46 @@ func TestScanMultiple(t *testing.T) { if a != 123 || s != "abc" { t.Errorf("Sscan wrong values: got (%d %q) expected (123 \"abc\")", a, s) } + n, err = Sscan("asdf", &s, &a) + if n != 1 { + t.Errorf("Sscan count error: expected 1: got %d", n) + } + if err == nil { + t.Errorf("Sscan expected error; got none", err) + } + if s != "asdf" { + t.Errorf("Sscan wrong values: got %q expected \"asdf\"", s) + } +} + +// Empty strings are not valid input when scanning a string. +func TestScanEmpty(t *testing.T) { + var s1, s2 string + n, err := Sscan("abc", &s1, &s2) + if n != 1 { + t.Errorf("Sscan count error: expected 1: got %d", n) + } + if err == nil { + t.Errorf("Sscan expected error; got none") + } + if s1 != "abc" { + t.Errorf("Sscan wrong values: got %q expected \"abc\"", s1) + } + n, err = Sscan("", &s1, &s2) + if n != 0 { + t.Errorf("Sscan count error: expected 0: got %d", n) + } + if err == nil { + t.Errorf("Sscan expected error; got none") + } + // Quoted empty string is OK. + n, err = Sscanf(`""`, "%q", &s1) + if n != 1 { + t.Errorf("Sscanf count error: expected 1: got %d", n) + } + if err != nil { + t.Errorf("Sscanf expected no error with quoted string; got %s", err) + } } func TestScanNotPointer(t *testing.T) {