]> Cypherpunks repositories - gostls13.git/commitdiff
net, net/http: adjust time-in-past constant even earlier
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 29 Mar 2017 16:55:58 +0000 (16:55 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 29 Mar 2017 17:18:13 +0000 (17:18 +0000)
The aLongTimeAgo time value in net and net/http is used to cancel
in-flight read and writes. It was set to time.Unix(233431200, 0)
which seemed like far enough in the past.

But Raspberry Pis, lacking a real time clock, had to spoil the fun and
boot in 1970 at the Unix epoch time, breaking assumptions in net and
net/http.

So change aLongTimeAgo to time.Unix(1, 0), which seems like the
earliest safe value. I don't trust subsecond values on all operating
systems, and I don't trust the Unix zero time. The Raspberry Pis do
advance their clock at least. And the reported problem was that Hijack
on a ResponseWriter hung forever, waiting for the connection read
operation to finish. So now, even if kernel + userspace boots in under
a second (unlikely), the Hijack will just have to wait for up to a
second.

Fixes #19747

Change-Id: Id59430de2e7b5b5117d4903a788863e9d344e53a
Reviewed-on: https://go-review.googlesource.com/38785
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/net/http/http.go
src/net/net.go

index 826f7ff3da5bd01165668e0c8267aac79281c25f..b95ca89f4094c5f04445c83ad5c3d9069cc777f9 100644 (file)
@@ -20,7 +20,7 @@ const maxInt64 = 1<<63 - 1
 
 // aLongTimeAgo is a non-zero time, far in the past, used for
 // immediate cancelation of network operations.
-var aLongTimeAgo = time.Unix(233431200, 0)
+var aLongTimeAgo = time.Unix(1, 0)
 
 // TODO(bradfitz): move common stuff here. The other files have accumulated
 // generic http stuff in random places.
index 9c27f1baf91ccd05c47df10972506decf678d242..bfb9c291b8f6286009b8543b09742cfab7037178 100644 (file)
@@ -467,7 +467,7 @@ func (e *OpError) Error() string {
 var (
        // aLongTimeAgo is a non-zero time, far in the past, used for
        // immediate cancelation of dials.
-       aLongTimeAgo = time.Unix(233431200, 0)
+       aLongTimeAgo = time.Unix(1, 0)
 
        // nonDeadline and noCancel are just zero values for
        // readability with functions taking too many parameters.