From: Lasse Folger Date: Mon, 3 Apr 2023 11:52:56 +0000 (+0200) Subject: go/internal/gcimporter: use saferio.ReadData instead of io.ReadAll when possible X-Git-Tag: go1.21rc1~1041 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=19409663a09ffc65a7ff193a23a75763a4b5befd;p=gostls13.git go/internal/gcimporter: use saferio.ReadData instead of io.ReadAll when possible saferio.ReadData avoids unnecessary allocations because the buffer can be preallocated with the right size (up to a limit) instead of having to resize and copy it step by step. Change-Id: Id70f6908971d4f126c601a9571ac3c67ea0accdc Reviewed-on: https://go-review.googlesource.com/c/go/+/481616 Reviewed-by: Matthew Dempsky Auto-Submit: Matthew Dempsky TryBot-Result: Gopher Robot Run-TryBot: Matthew Dempsky Reviewed-by: Ian Lance Taylor --- diff --git a/src/go/internal/gcimporter/gcimporter.go b/src/go/internal/gcimporter/gcimporter.go index 2140a9f98c..0b784de584 100644 --- a/src/go/internal/gcimporter/gcimporter.go +++ b/src/go/internal/gcimporter/gcimporter.go @@ -13,6 +13,7 @@ import ( "go/token" "go/types" "internal/pkgbits" + "internal/saferio" "io" "os" "os/exec" @@ -204,6 +205,7 @@ func Import(fset *token.FileSet, packages map[string]*types.Package, path, srcDi if exportFormat, err = buf.ReadByte(); err != nil { return } + size-- // The unified export format starts with a 'u'; the indexed export // format starts with an 'i'; and the older binary export format @@ -214,9 +216,10 @@ func Import(fset *token.FileSet, packages map[string]*types.Package, path, srcDi var data []byte var r io.Reader = buf if size >= 0 { - r = io.LimitReader(r, int64(size)) - } - if data, err = io.ReadAll(r); err != nil { + if data, err = saferio.ReadData(r, uint64(size)); err != nil { + return + } + } else if data, err = io.ReadAll(r); err != nil { return } s := string(data)