aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2019-02-15 12:15:11 +0100
committerTobias Klauser <tobias.klauser@gmail.com>2019-02-27 08:10:00 +0000
commit8da1b01e4c850d7cfbcdf5294e90d893e91a6a27 (patch)
tree3dcdf3feb3b0e25335b572c5669077398cfc1e05 /src
parent5a1c7b5841270f9f1b2836aa1d23b289ec24fdc2 (diff)
downloadgo-8da1b01e4c850d7cfbcdf5294e90d893e91a6a27.tar.xz
debug/pe: omit panic in (*File).ImportedSymbols on empty optional headers
If a PE file with invalid optional header size (neither sizeofOptionalHeader32 nor sizeofOptionalHeader64) is passed to NewFile, the File.OptionalHeader will be nil which leads to a panic in (*File).ImportedSymbols(). Fixes #30250 Change-Id: Ie97306de4a0e2dcfdc7b1b599891f574aa63adca Reviewed-on: https://go-review.googlesource.com/c/162858 Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/debug/pe/file.go4
-rw-r--r--src/debug/pe/file_test.go20
2 files changed, 24 insertions, 0 deletions
diff --git a/src/debug/pe/file.go b/src/debug/pe/file.go
index 1c308b3dc3..1d714bf6e7 100644
--- a/src/debug/pe/file.go
+++ b/src/debug/pe/file.go
@@ -324,6 +324,10 @@ type ImportDirectory struct {
// satisfied by other libraries at dynamic load time.
// It does not return weak symbols.
func (f *File) ImportedSymbols() ([]string, error) {
+ if f.OptionalHeader == nil {
+ return nil, nil
+ }
+
pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
// grab the number of data directory entries
diff --git a/src/debug/pe/file_test.go b/src/debug/pe/file_test.go
index 9613af3a3c..f4b24f7253 100644
--- a/src/debug/pe/file_test.go
+++ b/src/debug/pe/file_test.go
@@ -5,6 +5,7 @@
package pe
import (
+ "bytes"
"debug/dwarf"
"internal/testenv"
"io/ioutil"
@@ -627,3 +628,22 @@ func TestImportTableInUnknownSection(t *testing.T) {
t.Fatalf("unable to locate any imported symbols within file %q.", path)
}
}
+
+func TestInvalidFormat(t *testing.T) {
+ crashers := [][]byte{
+ // https://golang.org/issue/30250
+ []byte("\x00\x00\x00\x0000000\x00\x00\x00\x00\x00\x00\x000000" +
+ "00000000000000000000" +
+ "000000000\x00\x00\x0000000000" +
+ "00000000000000000000" +
+ "0000000000000000"),
+ }
+
+ for _, data := range crashers {
+ f, err := NewFile(bytes.NewReader(data))
+ if err != nil {
+ t.Error(err)
+ }
+ f.ImportedSymbols()
+ }
+}