From: Brad Fitzpatrick Date: Wed, 29 Mar 2017 16:55:58 +0000 (+0000) Subject: net, net/http: adjust time-in-past constant even earlier X-Git-Tag: go1.9beta1~937 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6983b9a57955fa12ecd81ab8394ee09e64ef21b9;p=gostls13.git net, net/http: adjust time-in-past constant even earlier 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 TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox --- diff --git a/src/net/http/http.go b/src/net/http/http.go index 826f7ff3da..b95ca89f40 100644 --- a/src/net/http/http.go +++ b/src/net/http/http.go @@ -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. diff --git a/src/net/net.go b/src/net/net.go index 9c27f1baf9..bfb9c291b8 100644 --- a/src/net/net.go +++ b/src/net/net.go @@ -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.