1
0
mirror of https://github.com/golang/go synced 2024-11-17 03:14:50 -07:00
go/src
Bryan C. Mills 07ede7a543 syscall: serialize locks on ForkLock on platforms where forkExecPipe is not atomic
In CL 421441, we changed syscall to allow concurrent calls to
forkExec.

On platforms that support the pipe2 syscall that is the right
behavior, because pipe2 atomically opens the pipe with CLOEXEC already
set.

However, on platforms that do not support pipe2 (currently aix and
darwin), syscall.forkExecPipe is not atomic, and the pipes do not
initially have CLOEXEC set. If two calls to forkExec proceed
concurrently, a pipe intended for one child process can be
accidentally inherited by the other. If the process is long-lived, the
pipe can be held open unexpectedly and prevent the parent process from
reaching EOF reading the child's status from the pipe.

Fixes #61080.
Updates #23558.
Updates #54162.

Change-Id: I83edcc80674ff267a39d06260c5697c654ff5a4b
Reviewed-on: https://go-review.googlesource.com/c/go/+/507355
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
Auto-Submit: Bryan Mills <bcmills@google.com>
2023-07-10 19:19:59 +00:00
..
archive
arena
bufio
builtin
bytes internal/bytealg: fix alignment code in equal_riscv64.s 2023-06-29 02:34:59 +00:00
cmd cmd/compile: fix clear on slice with zero size elem 2023-07-10 16:31:54 +00:00
cmp
compress compress/bzip2: fix typo 2023-06-16 18:24:46 +00:00
container
context
crypto crypto/x509: rename duplicated test 2023-06-23 19:48:23 +00:00
database/sql src/database/sql: run gofmt 2023-07-07 20:48:55 +00:00
debug
embed
encoding encoding: document that base32 and base64 do not use UTF-8 2023-06-27 17:27:30 +00:00
errors
expvar
flag
fmt
go go/types, types2: do not mutate arguments in NewChecker 2023-07-07 19:58:56 +00:00
hash all: fix spelling errors 2023-06-14 00:03:57 +00:00
html
image
index/suffixarray
internal internal/bytealg: fix alignment code in equal_riscv64.s 2023-06-29 02:34:59 +00:00
io
log log/slog: handle recursively empty groups 2023-07-07 15:07:02 +00:00
maps slices, maps: add examples; doc comment fixes 2023-06-29 15:34:32 +00:00
math math: add test that covers riscv64 fnm{add,sub} codegen 2023-07-07 17:39:26 +00:00
mime all: fix spelling errors 2023-06-14 00:03:57 +00:00
net net: only build cgo_stub.go on unix or wasip1 2023-07-06 19:37:13 +00:00
os syscall: serialize locks on ForkLock on platforms where forkExecPipe is not atomic 2023-07-10 19:19:59 +00:00
path path/filepath: avoid assuming that GOROOT/test is present 2023-06-16 19:37:46 +00:00
plugin
reflect reflect: fix ArenaNew to match documentation 2023-06-16 17:08:43 +00:00
regexp
runtime runtime: print output on failure in TestMemPprof 2023-07-06 20:35:47 +00:00
slices slices, maps: add examples; doc comment fixes 2023-06-29 15:34:32 +00:00
sort
strconv
strings
sync
syscall syscall: serialize locks on ForkLock on platforms where forkExecPipe is not atomic 2023-07-10 19:19:59 +00:00
testdata
testing testing/fstest: fix the Glob test when dir entries are out of order 2023-06-16 18:21:40 +00:00
text text/template: set variables correctly in range assignment 2023-06-15 14:28:01 +00:00
time
unicode
unsafe
vendor all: update vendored dependencies 2023-06-13 21:37:23 +00:00
all.bash
all.bat
all.rc
bootstrap.bash
buildall.bash
clean.bash
clean.bat
clean.rc
cmp.bash
go.mod all: update vendored dependencies 2023-06-13 21:37:23 +00:00
go.sum all: update vendored dependencies 2023-06-13 21:37:23 +00:00
make.bash
make.bat
Make.dist
make.rc
race.bash
race.bat
README.vendor
run.bash
run.bat
run.rc

Vendoring in std and cmd
========================

The Go command maintains copies of external packages needed by the
standard library in the src/vendor and src/cmd/vendor directories.

There are two modules, std and cmd, defined in src/go.mod and
src/cmd/go.mod. When a package outside std or cmd is imported
by a package inside std or cmd, the import path is interpreted
as if it had a "vendor/" prefix. For example, within "crypto/tls",
an import of "golang.org/x/crypto/cryptobyte" resolves to
"vendor/golang.org/x/crypto/cryptobyte". When a package with the
same path is imported from a package outside std or cmd, it will
be resolved normally. Consequently, a binary may be built with two
copies of a package at different versions if the package is
imported normally and vendored by the standard library.

Vendored packages are internally renamed with a "vendor/" prefix
to preserve the invariant that all packages have distinct paths.
This is necessary to avoid compiler and linker conflicts. Adding
a "vendor/" prefix also maintains the invariant that standard
library packages begin with a dotless path element.

The module requirements of std and cmd do not influence version
selection in other modules. They are only considered when running
module commands like 'go get' and 'go mod vendor' from a directory
in GOROOT/src.

Maintaining vendor directories
==============================

Before updating vendor directories, ensure that module mode is enabled.
Make sure that GO111MODULE is not set in the environment, or that it is
set to 'on' or 'auto'.

Requirements may be added, updated, and removed with 'go get'.
The vendor directory may be updated with 'go mod vendor'.
A typical sequence might be:

    cd src
    go get golang.org/x/net@latest
    go mod tidy
    go mod vendor

Use caution when passing '-u' to 'go get'. The '-u' flag updates
modules providing all transitively imported packages, not only
the module providing the target package.

Note that 'go mod vendor' only copies packages that are transitively
imported by packages in the current module. If a new package is needed,
it should be imported before running 'go mod vendor'.