]> Cypherpunks repositories - gostls13.git/commit
runtime: fix use after close race in Solaris network poller
authorAram Hăvărneanu <aram@mgk.ro>
Fri, 14 Mar 2014 13:53:05 +0000 (17:53 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Fri, 14 Mar 2014 13:53:05 +0000 (17:53 +0400)
commit199e70308351c2780f19ee0471febfd3cfd8f30f
tree0dd9a2044a02423156cf164f17d2a3b26d06fd89
parent4c6d2d6aa8aff8876a511882dd2a1facf4965667
runtime: fix use after close race in Solaris network poller

The Solaris network poller uses event ports, which are
level-triggered. As such, it has to re-arm itself after each
wakeup. The arming mechanism (which runs in its own thread) raced
with the closing of a file descriptor happening in a different
thread. When a network file descriptor is about to be closed,
the network poller is awaken to give it a chance to remove its
association with the file descriptor. Because the poller always
re-armed itself, it raced with code that closed the descriptor.

This change makes the network poller check before re-arming if
the file descriptor is about to be closed, in which case it will
ignore the re-arming request. It uses the per-PollDesc lock in
order to serialize access to the PollDesc.

This change also adds extensive documentation describing the
Solaris implementation of the network poller.

Fixes #7410.

LGTM=dvyukov, iant
R=golang-codereviews, bradfitz, iant, dvyukov, aram.h, gobot
CC=golang-codereviews
https://golang.org/cl/69190044
src/pkg/runtime/netpoll.goc
src/pkg/runtime/netpoll_solaris.c
src/pkg/runtime/runtime.h