Skip to content

Commit

Permalink
net, net/http: adjust time-in-past constant even earlier
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
bradfitz committed Mar 29, 2017
1 parent 041ecb6 commit 6983b9a
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/net/http/http.go
Expand Up @@ -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)

This comment has been minimized.

Copy link
@dolmen

dolmen Mar 31, 2017

Contributor

What is the secret story behind this value? A birth date?

This comment has been minimized.

Copy link
@maksimov

maksimov Mar 31, 2017

Star Wars started in cinemas on this day

var aLongTimeAgo = time.Unix(1, 0)

// TODO(bradfitz): move common stuff here. The other files have accumulated
// generic http stuff in random places.
Expand Down
2 changes: 1 addition & 1 deletion src/net/net.go
Expand Up @@ -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.
Expand Down

4 comments on commit 6983b9a

@ackleymi
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sad to see this go! :(

@kakilangit
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Damn you Raspberry Pi :'(

@kevburnsjr
Copy link

@kevburnsjr kevburnsjr commented on 6983b9a Apr 19, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IoT is why we can't have nice things :(

@imroc
Copy link

@imroc imroc commented on 6983b9a Apr 19, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice

Please sign in to comment.