diff options
author | Dave Cheney <dave@cheney.net> | 2012-12-18 07:52:23 +1100 |
---|---|---|
committer | Dave Cheney <dave@cheney.net> | 2012-12-18 07:52:23 +1100 |
commit | f2786aa248c232ed560fbd5e163582dd349ae6ba (patch) | |
tree | 9c481a80df22ded6e49842d93827f8b8f84222ed /src/pkg/time/format.go | |
parent | 00a0533bae41d3619ee1a8dee10ca2ff73dc8db3 (diff) | |
download | go-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.go | 15 |
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 { |