Commit 8da1b01e authored by Tobias Klauser's avatar Tobias Klauser Committed by Tobias Klauser

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: default avatarAlex Brainman <alex.brainman@gmail.com>
parent 5a1c7b58
...@@ -324,6 +324,10 @@ type ImportDirectory struct { ...@@ -324,6 +324,10 @@ type ImportDirectory struct {
// satisfied by other libraries at dynamic load time. // satisfied by other libraries at dynamic load time.
// It does not return weak symbols. // It does not return weak symbols.
func (f *File) ImportedSymbols() ([]string, error) { func (f *File) ImportedSymbols() ([]string, error) {
if f.OptionalHeader == nil {
return nil, nil
}
pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64 pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
// grab the number of data directory entries // grab the number of data directory entries
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package pe package pe
import ( import (
"bytes"
"debug/dwarf" "debug/dwarf"
"internal/testenv" "internal/testenv"
"io/ioutil" "io/ioutil"
...@@ -627,3 +628,22 @@ func TestImportTableInUnknownSection(t *testing.T) { ...@@ -627,3 +628,22 @@ func TestImportTableInUnknownSection(t *testing.T) {
t.Fatalf("unable to locate any imported symbols within file %q.", path) 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()
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment