[dev.boringcrypto.go1.17] all: merge go1.17.6 into dev.boringcrypto.go1.17

Change-Id: I0c3186c3d56c585934efc7f47eb78c7ac10a7c37
This commit is contained in:
David Chase 2022-01-14 12:08:34 -05:00
commit cfad1ff84c
26 changed files with 462 additions and 47 deletions

View File

@ -10,12 +10,14 @@ import (
"debug/elf" "debug/elf"
"flag" "flag"
"fmt" "fmt"
"io"
"log" "log"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"regexp" "regexp"
"runtime" "runtime"
"strconv"
"strings" "strings"
"syscall" "syscall"
"testing" "testing"
@ -263,6 +265,173 @@ func checkLineComments(t *testing.T, hdrname string) {
} }
} }
// checkArchive verifies that the created library looks OK.
// We just check a couple of things now, we can add more checks as needed.
func checkArchive(t *testing.T, arname string) {
t.Helper()
switch GOOS {
case "aix", "darwin", "ios", "windows":
// We don't have any checks for non-ELF libraries yet.
if _, err := os.Stat(arname); err != nil {
t.Errorf("archive %s does not exist: %v", arname, err)
}
default:
checkELFArchive(t, arname)
}
}
// checkELFArchive checks an ELF archive.
func checkELFArchive(t *testing.T, arname string) {
t.Helper()
f, err := os.Open(arname)
if err != nil {
t.Errorf("archive %s does not exist: %v", arname, err)
return
}
defer f.Close()
// TODO(iant): put these in a shared package? But where?
const (
magic = "!<arch>\n"
fmag = "`\n"
namelen = 16
datelen = 12
uidlen = 6
gidlen = 6
modelen = 8
sizelen = 10
fmaglen = 2
hdrlen = namelen + datelen + uidlen + gidlen + modelen + sizelen + fmaglen
)
type arhdr struct {
name string
date string
uid string
gid string
mode string
size string
fmag string
}
var magbuf [len(magic)]byte
if _, err := io.ReadFull(f, magbuf[:]); err != nil {
t.Errorf("%s: archive too short", arname)
return
}
if string(magbuf[:]) != magic {
t.Errorf("%s: incorrect archive magic string %q", arname, magbuf)
}
off := int64(len(magic))
for {
if off&1 != 0 {
var b [1]byte
if _, err := f.Read(b[:]); err != nil {
if err == io.EOF {
break
}
t.Errorf("%s: error skipping alignment byte at %d: %v", arname, off, err)
}
off++
}
var hdrbuf [hdrlen]byte
if _, err := io.ReadFull(f, hdrbuf[:]); err != nil {
if err == io.EOF {
break
}
t.Errorf("%s: error reading archive header at %d: %v", arname, off, err)
return
}
var hdr arhdr
hdrslice := hdrbuf[:]
set := func(len int, ps *string) {
*ps = string(bytes.TrimSpace(hdrslice[:len]))
hdrslice = hdrslice[len:]
}
set(namelen, &hdr.name)
set(datelen, &hdr.date)
set(uidlen, &hdr.uid)
set(gidlen, &hdr.gid)
set(modelen, &hdr.mode)
set(sizelen, &hdr.size)
hdr.fmag = string(hdrslice[:fmaglen])
hdrslice = hdrslice[fmaglen:]
if len(hdrslice) != 0 {
t.Fatalf("internal error: len(hdrslice) == %d", len(hdrslice))
}
if hdr.fmag != fmag {
t.Errorf("%s: invalid fmagic value %q at %d", arname, hdr.fmag, off)
return
}
size, err := strconv.ParseInt(hdr.size, 10, 64)
if err != nil {
t.Errorf("%s: error parsing size %q at %d: %v", arname, hdr.size, off, err)
return
}
off += hdrlen
switch hdr.name {
case "__.SYMDEF", "/", "/SYM64/":
// The archive symbol map.
case "//", "ARFILENAMES/":
// The extended name table.
default:
// This should be an ELF object.
checkELFArchiveObject(t, arname, off, io.NewSectionReader(f, off, size))
}
off += size
if _, err := f.Seek(off, os.SEEK_SET); err != nil {
t.Errorf("%s: failed to seek to %d: %v", arname, off, err)
}
}
}
// checkELFArchiveObject checks an object in an ELF archive.
func checkELFArchiveObject(t *testing.T, arname string, off int64, obj io.ReaderAt) {
t.Helper()
ef, err := elf.NewFile(obj)
if err != nil {
t.Errorf("%s: failed to open ELF file at %d: %v", arname, off, err)
return
}
defer ef.Close()
// Verify section types.
for _, sec := range ef.Sections {
want := elf.SHT_NULL
switch sec.Name {
case ".text", ".data":
want = elf.SHT_PROGBITS
case ".bss":
want = elf.SHT_NOBITS
case ".symtab":
want = elf.SHT_SYMTAB
case ".strtab":
want = elf.SHT_STRTAB
case ".init_array":
want = elf.SHT_INIT_ARRAY
case ".fini_array":
want = elf.SHT_FINI_ARRAY
case ".preinit_array":
want = elf.SHT_PREINIT_ARRAY
}
if want != elf.SHT_NULL && sec.Type != want {
t.Errorf("%s: incorrect section type in elf file at %d for section %q: got %v want %v", arname, off, sec.Name, sec.Type, want)
}
}
}
func TestInstall(t *testing.T) { func TestInstall(t *testing.T) {
if !testWork { if !testWork {
defer os.RemoveAll(filepath.Join(GOPATH, "pkg")) defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
@ -321,6 +490,7 @@ func TestEarlySignalHandler(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
checkLineComments(t, "libgo2.h") checkLineComments(t, "libgo2.h")
checkArchive(t, "libgo2.a")
ccArgs := append(cc, "-o", "testp"+exeSuffix, "main2.c", "libgo2.a") ccArgs := append(cc, "-o", "testp"+exeSuffix, "main2.c", "libgo2.a")
if runtime.Compiler == "gccgo" { if runtime.Compiler == "gccgo" {
@ -361,6 +531,7 @@ func TestSignalForwarding(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
checkLineComments(t, "libgo2.h") checkLineComments(t, "libgo2.h")
checkArchive(t, "libgo2.a")
ccArgs := append(cc, "-o", "testp"+exeSuffix, "main5.c", "libgo2.a") ccArgs := append(cc, "-o", "testp"+exeSuffix, "main5.c", "libgo2.a")
if runtime.Compiler == "gccgo" { if runtime.Compiler == "gccgo" {
@ -411,6 +582,7 @@ func TestSignalForwardingExternal(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
checkLineComments(t, "libgo2.h") checkLineComments(t, "libgo2.h")
checkArchive(t, "libgo2.a")
ccArgs := append(cc, "-o", "testp"+exeSuffix, "main5.c", "libgo2.a") ccArgs := append(cc, "-o", "testp"+exeSuffix, "main5.c", "libgo2.a")
if runtime.Compiler == "gccgo" { if runtime.Compiler == "gccgo" {
@ -528,6 +700,7 @@ func TestOsSignal(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
checkLineComments(t, "libgo3.h") checkLineComments(t, "libgo3.h")
checkArchive(t, "libgo3.a")
ccArgs := append(cc, "-o", "testp"+exeSuffix, "main3.c", "libgo3.a") ccArgs := append(cc, "-o", "testp"+exeSuffix, "main3.c", "libgo3.a")
if runtime.Compiler == "gccgo" { if runtime.Compiler == "gccgo" {
@ -565,6 +738,7 @@ func TestSigaltstack(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
checkLineComments(t, "libgo4.h") checkLineComments(t, "libgo4.h")
checkArchive(t, "libgo4.a")
ccArgs := append(cc, "-o", "testp"+exeSuffix, "main4.c", "libgo4.a") ccArgs := append(cc, "-o", "testp"+exeSuffix, "main4.c", "libgo4.a")
if runtime.Compiler == "gccgo" { if runtime.Compiler == "gccgo" {
@ -752,6 +926,7 @@ func TestSIGPROF(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
checkLineComments(t, "libgo6.h") checkLineComments(t, "libgo6.h")
checkArchive(t, "libgo6.a")
ccArgs := append(cc, "-o", "testp6"+exeSuffix, "main6.c", "libgo6.a") ccArgs := append(cc, "-o", "testp6"+exeSuffix, "main6.c", "libgo6.a")
if runtime.Compiler == "gccgo" { if runtime.Compiler == "gccgo" {
@ -795,6 +970,7 @@ func TestCompileWithoutShared(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
checkLineComments(t, "libgo2.h") checkLineComments(t, "libgo2.h")
checkArchive(t, "libgo2.a")
exe := "./testnoshared" + exeSuffix exe := "./testnoshared" + exeSuffix
@ -899,6 +1075,7 @@ func TestManyCalls(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
checkLineComments(t, "libgo7.h") checkLineComments(t, "libgo7.h")
checkArchive(t, "libgo7.a")
ccArgs := append(cc, "-o", "testp7"+exeSuffix, "main7.c", "libgo7.a") ccArgs := append(cc, "-o", "testp7"+exeSuffix, "main7.c", "libgo7.a")
if runtime.Compiler == "gccgo" { if runtime.Compiler == "gccgo" {

View File

@ -5118,6 +5118,18 @@ func (s *state) call(n *ir.CallExpr, k callKind, returnResultAddr bool) *ssa.Val
for _, p := range params.InParams() { // includes receiver for interface calls for _, p := range params.InParams() { // includes receiver for interface calls
ACArgs = append(ACArgs, p.Type) ACArgs = append(ACArgs, p.Type)
} }
// Split the entry block if there are open defers, because later calls to
// openDeferSave may cause a mismatch between the mem for an OpDereference
// and the call site which uses it. See #49282.
if s.curBlock.ID == s.f.Entry.ID && s.hasOpenDefers {
b := s.endBlock()
b.Kind = ssa.BlockPlain
curb := s.f.NewBlock(ssa.BlockPlain)
b.AddEdgeTo(curb)
s.startBlock(curb)
}
for i, n := range args { for i, n := range args {
callArgs = append(callArgs, s.putArg(n, t.Params().Field(i).Type)) callArgs = append(callArgs, s.putArg(n, t.Params().Field(i).Type))
} }

View File

@ -12,7 +12,7 @@ require (
require ( require (
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 // indirect github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 // indirect
golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e // indirect golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e // indirect
golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744 // indirect golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
) )

View File

@ -10,8 +10,8 @@ golang.org/x/arch v0.0.0-20210502124803-cbf565b21d1e h1:pv3V0NlNSh5Q6AX/StwGLBjc
golang.org/x/arch v0.0.0-20210502124803-cbf565b21d1e/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.0.0-20210502124803-cbf565b21d1e/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e h1:8foAy0aoO5GkqCvAEJ4VC4P3zksTg4X4aJCDpZzmgQI= golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e h1:1SzTfNOXwIS2oWiMF+6qu0OUDKb0dauo6MoDUQyu+yU=
golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=

View File

@ -1084,7 +1084,12 @@ func elfshbits(linkmode LinkMode, sect *sym.Section) *ElfShdr {
} }
if sect.Vaddr < sect.Seg.Vaddr+sect.Seg.Filelen { if sect.Vaddr < sect.Seg.Vaddr+sect.Seg.Filelen {
sh.Type = uint32(elf.SHT_PROGBITS) switch sect.Name {
case ".init_array":
sh.Type = uint32(elf.SHT_INIT_ARRAY)
default:
sh.Type = uint32(elf.SHT_PROGBITS)
}
} else { } else {
sh.Type = uint32(elf.SHT_NOBITS) sh.Type = uint32(elf.SHT_NOBITS)
} }

View File

@ -24,7 +24,7 @@ golang.org/x/arch/arm/armasm
golang.org/x/arch/arm64/arm64asm golang.org/x/arch/arm64/arm64asm
golang.org/x/arch/ppc64/ppc64asm golang.org/x/arch/ppc64/ppc64asm
golang.org/x/arch/x86/x86asm golang.org/x/arch/x86/x86asm
# golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e # golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e
## explicit; go 1.17 ## explicit; go 1.17
golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519
golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ed25519/internal/edwards25519

View File

@ -3216,3 +3216,98 @@ func TestAuthKeyIdOptional(t *testing.T) {
t.Fatalf("ParseCertificate to failed to parse certificate with optional authority key identifier fields: %s", err) t.Fatalf("ParseCertificate to failed to parse certificate with optional authority key identifier fields: %s", err)
} }
} }
const largeOIDPEM = `
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
da:ba:53:19:1b:09:4b:82:b2:89:26:7d:c7:6f:a0:02
Signature Algorithm: sha256WithRSAEncryption
Issuer: O = Acme Co
Validity
Not Before: Dec 21 16:59:27 2021 GMT
Not After : Dec 21 16:59:27 2022 GMT
Subject: O = Acme Co
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:bf:17:16:d8:bc:29:9c:16:e5:76:b4:93:15:78:
ad:6e:45:c5:4a:63:46:a1:b2:76:71:65:51:9c:14:
c4:ea:74:13:e4:34:df:2f:2c:65:11:e8:56:52:69:
11:f9:0e:fc:77:bb:63:a8:7c:1a:c6:a1:7b:6e:6c:
e7:18:25:25:c9:e8:fb:06:7f:a2:a9:98:fe:2a:bc:
8a:b3:75:b6:b8:7d:b6:c9:6b:29:08:32:22:10:cb:
8d:d6:60:c8:83:ad:f5:58:91:d6:11:e8:55:56:fb:
8f:a3:a2:9f:48:cb:79:e4:65:4a:8c:a6:52:64:9f:
99:38:35:d4:d5:ac:6f:cf:a0:cb:42:8c:07:eb:21:
17:31:3a:eb:91:7b:62:43:a4:75:5f:ef:a7:2f:94:
f8:69:0b:d4:ec:09:e6:00:c0:8c:dd:07:63:0b:e4:
77:aa:60:18:3c:a0:e0:ae:0a:ea:0e:52:3b:b4:fa:
6a:30:1b:50:62:21:73:53:33:01:60:a1:6b:99:58:
00:f3:77:c6:0f:46:19:ca:c2:5d:cd:f5:e2:52:4d:
84:94:23:d3:32:2f:ae:5f:da:43:a1:19:95:d2:17:
dd:49:14:b4:d9:48:1c:08:13:93:8e:d5:09:43:21:
b6:ce:52:e8:87:bb:d2:60:0d:c6:4e:bf:c5:93:6a:
c6:bf
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Alternative Name:
DNS:longOID.example
X509v3 Certificate Policies:
Policy: 1.3.6.1.4.1.311.21.8.1492336001
Signature Algorithm: sha256WithRSAEncryption
72:77:8b:de:48:fb:6d:9a:94:b1:be:d4:90:7d:4c:e6:d3:79:
fa:fb:fc:3e:d5:3d:e9:a0:ce:28:2b:2f:94:77:3f:87:f8:9c:
9f:91:1c:f3:f6:58:91:15:6b:24:b9:ca:ae:9f:ee:ca:c8:31:
db:1a:3d:bb:6b:83:6d:bc:81:8b:a1:79:d5:3e:bb:dd:93:fe:
35:3e:b7:99:e0:d6:eb:58:0c:fd:42:73:dc:49:da:e2:b7:ae:
15:ee:e6:cc:aa:ef:91:41:9a:18:46:8d:4a:39:65:a2:85:3c:
7f:0c:41:f8:0b:9c:e8:1f:35:36:60:8d:8c:e0:8e:18:b1:06:
57:d0:4e:c4:c3:cd:8f:6f:e7:76:02:52:da:03:43:61:2b:b3:
bf:19:fd:73:0d:6a:0b:b4:b6:cb:a9:6f:70:4e:53:2a:54:07:
b3:74:fd:85:49:57:5b:23:8d:8c:6b:53:2b:09:e8:41:a5:80:
3f:69:1b:11:d1:6b:13:35:2e:f9:d6:50:15:d9:91:38:42:43:
e9:17:af:67:d9:96:a4:d1:6a:4f:cc:b4:a7:8e:48:1f:00:72:
69:de:4d:f1:73:a4:47:12:67:e9:f9:07:3e:79:75:90:42:b8:
d4:b5:fd:d1:7e:35:04:f7:00:04:cf:f1:36:be:0f:27:81:1f:
a6:ba:88:6c
-----BEGIN CERTIFICATE-----
MIIDHTCCAgWgAwIBAgIRANq6UxkbCUuCsokmfcdvoAIwDQYJKoZIhvcNAQELBQAw
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0yMTEyMjExNjU5MjdaFw0yMjEyMjExNjU5
MjdaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQC/FxbYvCmcFuV2tJMVeK1uRcVKY0ahsnZxZVGcFMTqdBPkNN8vLGUR
6FZSaRH5Dvx3u2OofBrGoXtubOcYJSXJ6PsGf6KpmP4qvIqzdba4fbbJaykIMiIQ
y43WYMiDrfVYkdYR6FVW+4+jop9Iy3nkZUqMplJkn5k4NdTVrG/PoMtCjAfrIRcx
OuuRe2JDpHVf76cvlPhpC9TsCeYAwIzdB2ML5HeqYBg8oOCuCuoOUju0+mowG1Bi
IXNTMwFgoWuZWADzd8YPRhnKwl3N9eJSTYSUI9MyL65f2kOhGZXSF91JFLTZSBwI
E5OO1QlDIbbOUuiHu9JgDcZOv8WTasa/AgMBAAGjbjBsMA4GA1UdDwEB/wQEAwIF
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBoGA1UdEQQTMBGC
D2xvbmdPSUQuZXhhbXBsZTAbBgNVHSAEFDASMBAGDisGAQQBgjcVCIXHzPsBMA0G
CSqGSIb3DQEBCwUAA4IBAQByd4veSPttmpSxvtSQfUzm03n6+/w+1T3poM4oKy+U
dz+H+JyfkRzz9liRFWskucqun+7KyDHbGj27a4NtvIGLoXnVPrvdk/41PreZ4Nbr
WAz9QnPcSdrit64V7ubMqu+RQZoYRo1KOWWihTx/DEH4C5zoHzU2YI2M4I4YsQZX
0E7Ew82Pb+d2AlLaA0NhK7O/Gf1zDWoLtLbLqW9wTlMqVAezdP2FSVdbI42Ma1Mr
CehBpYA/aRsR0WsTNS751lAV2ZE4QkPpF69n2Zak0WpPzLSnjkgfAHJp3k3xc6RH
Emfp+Qc+eXWQQrjUtf3RfjUE9wAEz/E2vg8ngR+muohs
-----END CERTIFICATE-----`
func TestLargeOID(t *testing.T) {
// See Issue 49678.
b, _ := pem.Decode([]byte(largeOIDPEM))
if b == nil {
t.Fatalf("couldn't decode test certificate")
}
_, err := ParseCertificate(b.Bytes)
if err != nil {
t.Fatalf("ParseCertificate to failed to parse certificate with large OID: %s", err)
}
}

View File

@ -3,8 +3,8 @@ module std
go 1.17 go 1.17
require ( require (
golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e
golang.org/x/net v0.0.0-20211209100829-84cba5454caf golang.org/x/net v0.0.0-20220106012031-21a9c9cfe9c3
) )
require ( require (

View File

@ -1,8 +1,8 @@
golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e h1:8foAy0aoO5GkqCvAEJ4VC4P3zksTg4X4aJCDpZzmgQI= golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e h1:1SzTfNOXwIS2oWiMF+6qu0OUDKb0dauo6MoDUQyu+yU=
golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211209100829-84cba5454caf h1:Chci/BE/+xVqrcWnObL99NS8gtXyJrhHDlygBQrggHM= golang.org/x/net v0.0.0-20220106012031-21a9c9cfe9c3 h1:3S9JjS9zI0UiDupLpAuaeuciTu/gEk5jf35rQgqOhXQ=
golang.org/x/net v0.0.0-20211209100829-84cba5454caf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220106012031-21a9c9cfe9c3/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744 h1:yhBbb4IRs2HS9PPlAg6DMC6mUOKexJBNsLf4Z+6En1Q= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744 h1:yhBbb4IRs2HS9PPlAg6DMC6mUOKexJBNsLf4Z+6En1Q=

View File

@ -33,6 +33,24 @@ type RegArgs struct {
ReturnIsPtr IntArgRegBitmap ReturnIsPtr IntArgRegBitmap
} }
func (r *RegArgs) Dump() {
print("Ints:")
for _, x := range r.Ints {
print(" ", x)
}
println()
print("Floats:")
for _, x := range r.Floats {
print(" ", x)
}
println()
print("Ptrs:")
for _, x := range r.Ptrs {
print(" ", x)
}
println()
}
// IntArgRegBitmap is a bitmap large enough to hold one bit per // IntArgRegBitmap is a bitmap large enough to hold one bit per
// integer argument/return register. // integer argument/return register.
type IntArgRegBitmap [(IntArgRegs + 7) / 8]uint8 type IntArgRegBitmap [(IntArgRegs + 7) / 8]uint8

View File

@ -9901,7 +9901,8 @@ type http2WriteScheduler interface {
// Pop dequeues the next frame to write. Returns false if no frames can // Pop dequeues the next frame to write. Returns false if no frames can
// be written. Frames with a given wr.StreamID() are Pop'd in the same // be written. Frames with a given wr.StreamID() are Pop'd in the same
// order they are Push'd. No frames should be discarded except by CloseStream. // order they are Push'd, except RST_STREAM frames. No frames should be
// discarded except by CloseStream.
Pop() (wr http2FrameWriteRequest, ok bool) Pop() (wr http2FrameWriteRequest, ok bool)
} }
@ -9921,6 +9922,7 @@ type http2FrameWriteRequest struct {
// stream is the stream on which this frame will be written. // stream is the stream on which this frame will be written.
// nil for non-stream frames like PING and SETTINGS. // nil for non-stream frames like PING and SETTINGS.
// nil for RST_STREAM streams, which use the StreamError.StreamID field instead.
stream *http2stream stream *http2stream
// done, if non-nil, must be a buffered channel with space for // done, if non-nil, must be a buffered channel with space for
@ -10600,11 +10602,11 @@ func (ws *http2randomWriteScheduler) AdjustStream(streamID uint32, priority http
} }
func (ws *http2randomWriteScheduler) Push(wr http2FrameWriteRequest) { func (ws *http2randomWriteScheduler) Push(wr http2FrameWriteRequest) {
id := wr.StreamID() if wr.isControl() {
if id == 0 {
ws.zero.push(wr) ws.zero.push(wr)
return return
} }
id := wr.StreamID()
q, ok := ws.sq[id] q, ok := ws.sq[id]
if !ok { if !ok {
q = ws.queuePool.get() q = ws.queuePool.get()
@ -10614,7 +10616,7 @@ func (ws *http2randomWriteScheduler) Push(wr http2FrameWriteRequest) {
} }
func (ws *http2randomWriteScheduler) Pop() (http2FrameWriteRequest, bool) { func (ws *http2randomWriteScheduler) Pop() (http2FrameWriteRequest, bool) {
// Control frames first. // Control and RST_STREAM frames first.
if !ws.zero.empty() { if !ws.zero.empty() {
return ws.zero.shift(), true return ws.zero.shift(), true
} }

View File

@ -6270,6 +6270,29 @@ func TestCallMethodJump(t *testing.T) {
*CallGC = false *CallGC = false
} }
func TestCallArgLive(t *testing.T) {
type T struct{ X, Y *string } // pointerful aggregate
F := func(t T) { *t.X = "ok" }
// In reflect.Value.Call, trigger a garbage collection in reflect.call
// between marshaling argument and the actual call.
*CallGC = true
x := new(string)
runtime.SetFinalizer(x, func(p *string) {
if *p != "ok" {
t.Errorf("x dead prematurely")
}
})
v := T{x, nil}
ValueOf(F).Call([]Value{ValueOf(v)})
// Stop garbage collecting during reflect.call.
*CallGC = false
}
func TestMakeFuncStackCopy(t *testing.T) { func TestMakeFuncStackCopy(t *testing.T) {
target := func(in []Value) []Value { target := func(in []Value) []Value {
runtime.GC() runtime.GC()

View File

@ -352,7 +352,7 @@ func (v Value) CallSlice(in []Value) []Value {
return v.call("CallSlice", in) return v.call("CallSlice", in)
} }
var callGC bool // for testing; see TestCallMethodJump var callGC bool // for testing; see TestCallMethodJump and TestCallArgLive
const debugReflectCall = false const debugReflectCall = false
@ -509,12 +509,16 @@ func (v Value) call(op string, in []Value) []Value {
// Copy values to "integer registers." // Copy values to "integer registers."
if v.flag&flagIndir != 0 { if v.flag&flagIndir != 0 {
offset := add(v.ptr, st.offset, "precomputed value offset") offset := add(v.ptr, st.offset, "precomputed value offset")
memmove(unsafe.Pointer(&regArgs.Ints[st.ireg]), offset, st.size)
} else {
if st.kind == abiStepPointer { if st.kind == abiStepPointer {
// Duplicate this pointer in the pointer area of the // Duplicate this pointer in the pointer area of the
// register space. Otherwise, there's the potential for // register space. Otherwise, there's the potential for
// this to be the last reference to v.ptr. // this to be the last reference to v.ptr.
regArgs.Ptrs[st.ireg] = *(*unsafe.Pointer)(offset)
}
memmove(unsafe.Pointer(&regArgs.Ints[st.ireg]), offset, st.size)
} else {
if st.kind == abiStepPointer {
// See the comment in abiStepPointer case above.
regArgs.Ptrs[st.ireg] = v.ptr regArgs.Ptrs[st.ireg] = v.ptr
} }
regArgs.Ints[st.ireg] = uintptr(v.ptr) regArgs.Ints[st.ireg] = uintptr(v.ptr)
@ -539,6 +543,15 @@ func (v Value) call(op string, in []Value) []Value {
// Mark pointers in registers for the return path. // Mark pointers in registers for the return path.
regArgs.ReturnIsPtr = abi.outRegPtrs regArgs.ReturnIsPtr = abi.outRegPtrs
if debugReflectCall {
regArgs.Dump()
}
// For testing; see TestCallArgLive.
if callGC {
runtime.GC()
}
// Call. // Call.
call(frametype, fn, stackArgs, uint32(frametype.size), uint32(abi.retOffset), uint32(frameSize), &regArgs) call(frametype, fn, stackArgs, uint32(frametype.size), uint32(abi.retOffset), uint32(frameSize), &regArgs)

View File

@ -1066,7 +1066,19 @@ func FreePageAlloc(pp *PageAlloc) {
// //
// This should not be higher than 0x100*pallocChunkBytes to support // This should not be higher than 0x100*pallocChunkBytes to support
// mips and mipsle, which only have 31-bit address spaces. // mips and mipsle, which only have 31-bit address spaces.
var BaseChunkIdx = ChunkIdx(chunkIndex(((0xc000*pageAlloc64Bit + 0x100*pageAlloc32Bit) * pallocChunkBytes) + arenaBaseOffset*sys.GoosAix)) var BaseChunkIdx = func() ChunkIdx {
var prefix uintptr
if pageAlloc64Bit != 0 {
prefix = 0xc000
} else {
prefix = 0x100
}
baseAddr := prefix * pallocChunkBytes
if sys.GoosAix != 0 {
baseAddr += arenaBaseOffset
}
return ChunkIdx(chunkIndex(baseAddr))
}()
// PageBase returns an address given a chunk index and a page index // PageBase returns an address given a chunk index and a page index
// relative to that chunk. // relative to that chunk.

View File

@ -199,15 +199,21 @@ const (
// we further limit it to 31 bits. // we further limit it to 31 bits.
// //
// On ios/arm64, although 64-bit pointers are presumably // On ios/arm64, although 64-bit pointers are presumably
// available, pointers are truncated to 33 bits. Furthermore, // available, pointers are truncated to 33 bits in iOS <14.
// only the top 4 GiB of the address space are actually available // Furthermore, only the top 4 GiB of the address space are
// to the application, but we allow the whole 33 bits anyway for // actually available to the application. In iOS >=14, more
// simplicity. // of the address space is available, and the OS can now
// TODO(mknyszek): Consider limiting it to 32 bits and using // provide addresses outside of those 33 bits. Pick 40 bits
// arenaBaseOffset to offset into the top 4 GiB. // as a reasonable balance between address space usage by the
// page allocator, and flexibility for what mmap'd regions
// we'll accept for the heap. We can't just move to the full
// 48 bits because this uses too much address space for older
// iOS versions.
// TODO(mknyszek): Once iOS <14 is deprecated, promote ios/arm64
// to a 48-bit address space like every other arm64 platform.
// //
// WebAssembly currently has a limit of 4GB linear memory. // WebAssembly currently has a limit of 4GB linear memory.
heapAddrBits = (_64bit*(1-sys.GoarchWasm)*(1-sys.GoosIos*sys.GoarchArm64))*48 + (1-_64bit+sys.GoarchWasm)*(32-(sys.GoarchMips+sys.GoarchMipsle)) + 33*sys.GoosIos*sys.GoarchArm64 heapAddrBits = (_64bit*(1-sys.GoarchWasm)*(1-sys.GoosIos*sys.GoarchArm64))*48 + (1-_64bit+sys.GoarchWasm)*(32-(sys.GoarchMips+sys.GoarchMipsle)) + 40*sys.GoosIos*sys.GoarchArm64
// maxAlloc is the maximum size of an allocation. On 64-bit, // maxAlloc is the maximum size of an allocation. On 64-bit,
// it's theoretically possible to allocate 1<<heapAddrBits bytes. On // it's theoretically possible to allocate 1<<heapAddrBits bytes. On

View File

@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"math/rand" "math/rand"
. "runtime" . "runtime"
"runtime/internal/sys"
"testing" "testing"
) )
@ -408,7 +409,9 @@ func TestPageAllocScavenge(t *testing.T) {
}, },
}, },
} }
if PageAlloc64Bit != 0 { // Disable these tests on iOS since we have a small address space.
// See #46860.
if PageAlloc64Bit != 0 && sys.GoosIos == 0 {
tests["ScavAllVeryDiscontiguous"] = setup{ tests["ScavAllVeryDiscontiguous"] = setup{
beforeAlloc: map[ChunkIdx][]BitRange{ beforeAlloc: map[ChunkIdx][]BitRange{
BaseChunkIdx: {}, BaseChunkIdx: {},

View File

@ -2,20 +2,14 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
//go:build 386 || arm || mips || mipsle || wasm || (ios && arm64) //go:build 386 || arm || mips || mipsle || wasm
// +build 386 arm mips mipsle wasm ios,arm64 // +build 386 arm mips mipsle wasm
// wasm is a treated as a 32-bit architecture for the purposes of the page // wasm is a treated as a 32-bit architecture for the purposes of the page
// allocator, even though it has 64-bit pointers. This is because any wasm // allocator, even though it has 64-bit pointers. This is because any wasm
// pointer always has its top 32 bits as zero, so the effective heap address // pointer always has its top 32 bits as zero, so the effective heap address
// space is only 2^32 bytes in size (see heapAddrBits). // space is only 2^32 bytes in size (see heapAddrBits).
// ios/arm64 is treated as a 32-bit architecture for the purposes of the
// page allocator, even though it has 64-bit pointers and a 33-bit address
// space (see heapAddrBits). The 33 bit address space cannot be rounded up
// to 64 bits because there are too many summary levels to fit in just 33
// bits.
package runtime package runtime
import "unsafe" import "unsafe"

View File

@ -2,10 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
//go:build amd64 || (!ios && arm64) || mips64 || mips64le || ppc64 || ppc64le || riscv64 || s390x //go:build amd64 || arm64 || mips64 || mips64le || ppc64 || ppc64le || riscv64 || s390x
// +build amd64 !ios,arm64 mips64 mips64le ppc64 ppc64le riscv64 s390x // +build amd64 arm64 mips64 mips64le ppc64 ppc64le riscv64 s390x
// See mpagealloc_32bit.go for why ios/arm64 is excluded here.
package runtime package runtime

View File

@ -7,6 +7,7 @@ package runtime_test
import ( import (
"fmt" "fmt"
. "runtime" . "runtime"
"runtime/internal/sys"
"testing" "testing"
) )
@ -165,7 +166,9 @@ func TestPageAllocGrow(t *testing.T) {
}, },
}, },
} }
if PageAlloc64Bit != 0 { // Disable these tests on iOS since we have a small address space.
// See #46860.
if PageAlloc64Bit != 0 && sys.GoosIos == 0 {
tests["ExtremelyDiscontiguous"] = test{ tests["ExtremelyDiscontiguous"] = test{
chunks: []ChunkIdx{ chunks: []ChunkIdx{
BaseChunkIdx, BaseChunkIdx,
@ -571,7 +574,9 @@ func TestPageAllocAlloc(t *testing.T) {
}, },
}, },
} }
if PageAlloc64Bit != 0 { // Disable these tests on iOS since we have a small address space.
// See #46860.
if PageAlloc64Bit != 0 && sys.GoosIos == 0 {
const chunkIdxBigJump = 0x100000 // chunk index offset which translates to O(TiB) const chunkIdxBigJump = 0x100000 // chunk index offset which translates to O(TiB)
// This test attempts to trigger a bug wherein we look at unmapped summary // This test attempts to trigger a bug wherein we look at unmapped summary

View File

@ -7,6 +7,7 @@ package runtime_test
import ( import (
"math/rand" "math/rand"
. "runtime" . "runtime"
"runtime/internal/sys"
"testing" "testing"
) )
@ -350,7 +351,9 @@ func TestPageAllocAllocToCache(t *testing.T) {
}, },
}, },
} }
if PageAlloc64Bit != 0 { // Disable these tests on iOS since we have a small address space.
// See #46860.
if PageAlloc64Bit != 0 && sys.GoosIos == 0 {
const chunkIdxBigJump = 0x100000 // chunk index offset which translates to O(TiB) const chunkIdxBigJump = 0x100000 // chunk index offset which translates to O(TiB)
// This test is similar to the one with the same name for // This test is similar to the one with the same name for

View File

@ -4,12 +4,12 @@ the LLVM project (https://github.com/llvm/llvm-project/tree/main/compiler-rt).
To update the .syso files use golang.org/x/build/cmd/racebuild. To update the .syso files use golang.org/x/build/cmd/racebuild.
race_darwin_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b. race_darwin_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 with https://reviews.llvm.org/D114825 applied and Go 7ccbcc90560468937f02609a43cb39a6e13ff797.
race_freebsd_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b. race_freebsd_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b.
race_linux_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b. race_linux_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b.
race_linux_ppc64le.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b. race_linux_ppc64le.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b.
race_netbsd_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b. race_netbsd_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b.
race_windows_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b. race_windows_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b.
race_linux_arm64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b. race_linux_arm64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b.
race_darwin_arm64.syso built with LLVM 00da38ce2d36c07f12c287dc515d37bb7bc410e9 and Go fe70a3a0fd31441bcbb9932ecab11a6083cf2119. race_darwin_arm64.syso built with LLVM 00da38ce2d36c07f12c287dc515d37bb7bc410e9 with https://reviews.llvm.org/D114825 applied and Go 7ccbcc90560468937f02609a43cb39a6e13ff797.
race_openbsd_amd64.syso built with LLVM fcf6ae2f070eba73074b6ec8d8281e54d29dbeeb and Go 8f2db14cd35bbd674cb2988a508306de6655e425. race_openbsd_amd64.syso built with LLVM fcf6ae2f070eba73074b6ec8d8281e54d29dbeeb and Go 8f2db14cd35bbd674cb2988a508306de6655e425.

View File

@ -407,7 +407,12 @@ func (s *String) ReadASN1Enum(out *int) bool {
func (s *String) readBase128Int(out *int) bool { func (s *String) readBase128Int(out *int) bool {
ret := 0 ret := 0
for i := 0; len(*s) > 0; i++ { for i := 0; len(*s) > 0; i++ {
if i == 4 { if i == 5 {
return false
}
// Avoid overflowing int on a 32-bit platform.
// We don't want different behavior based on the architecture.
if ret >= 1<<(31-7) {
return false return false
} }
ret <<= 7 ret <<= 7

View File

@ -1,4 +1,4 @@
# golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e # golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e
## explicit; go 1.17 ## explicit; go 1.17
golang.org/x/crypto/chacha20 golang.org/x/crypto/chacha20
golang.org/x/crypto/chacha20poly1305 golang.org/x/crypto/chacha20poly1305
@ -8,7 +8,7 @@ golang.org/x/crypto/curve25519
golang.org/x/crypto/hkdf golang.org/x/crypto/hkdf
golang.org/x/crypto/internal/subtle golang.org/x/crypto/internal/subtle
golang.org/x/crypto/poly1305 golang.org/x/crypto/poly1305
# golang.org/x/net v0.0.0-20211209100829-84cba5454caf # golang.org/x/net v0.0.0-20220106012031-21a9c9cfe9c3
## explicit; go 1.17 ## explicit; go 1.17
golang.org/x/net/dns/dnsmessage golang.org/x/net/dns/dnsmessage
golang.org/x/net/http/httpguts golang.org/x/net/http/httpguts

View File

@ -0,0 +1,44 @@
// compile
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package p
//go:noinline
func g(d uintptr, a, m []int, s struct {
a, b, c, d, e int
}, u uint) {
_ = a
_ = m
_ = s
func() {
for i := 0; i < 5; i++ {
_ = a
_ = m
_, _ = s, s
}
}()
}
var One float64 = 1.0
func f(d uintptr) {
var a, m []int
var s struct {
a, b, c, d, e int
}
g(d, a, m, s, uint(One)) // Uint of not-a-constant inserts a conditional, necessary to bug
defer func() uint {
return 0
}()
}
var d uintptr
func h() {
f(d)
}