summaryrefslogtreecommitdiff
path: root/src/pkg/time/format.go
diff options
context:
space:
mode:
authorDave Cheney <dave@cheney.net>2012-12-18 07:52:23 +1100
committerDave Cheney <dave@cheney.net>2012-12-18 07:52:23 +1100
commitf2786aa248c232ed560fbd5e163582dd349ae6ba (patch)
tree9c481a80df22ded6e49842d93827f8b8f84222ed /src/pkg/time/format.go
parent00a0533bae41d3619ee1a8dee10ca2ff73dc8db3 (diff)
downloadgo-f2786aa248c232ed560fbd5e163582dd349ae6ba.tar.gz
time: fix panic with time.Parse(time.StampNano, ... )
Fixes issue 4502. R=rsc CC=golang-dev https://codereview.appspot.com/6949058
Diffstat (limited to 'src/pkg/time/format.go')
-rw-r--r--src/pkg/time/format.go15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/pkg/time/format.go b/src/pkg/time/format.go
index aab4a4d6b..417e8f8d7 100644
--- a/src/pkg/time/format.go
+++ b/src/pkg/time/format.go
@@ -854,9 +854,15 @@ func Parse(layout, value string) (Time, error) {
zoneName = p
case stdFracSecond0:
- ndigit := std >> stdArgShift
- nsec, rangeErrString, err = parseNanoseconds(value, 1+ndigit)
- value = value[1+ndigit:]
+ // stdFracSecond0 requires the exact number of digits as specified in
+ // the layout.
+ ndigit := 1 + (std >> stdArgShift)
+ if len(value) < ndigit {
+ err = errBad
+ break
+ }
+ nsec, rangeErrString, err = parseNanoseconds(value, ndigit)
+ value = value[ndigit:]
case stdFracSecond9:
if len(value) < 2 || value[0] != '.' || value[1] < '0' || '9' < value[1] {
@@ -934,8 +940,7 @@ func parseNanoseconds(value string, nbytes int) (ns int, rangeErrString string,
err = errBad
return
}
- ns, err = atoi(value[1:nbytes])
- if err != nil {
+ if ns, err = atoi(value[1:nbytes]); err != nil {
return
}
if ns < 0 || 1e9 <= ns {