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>
// 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
package pe
import (
+ "bytes"
"debug/dwarf"
"internal/testenv"
"io/ioutil"
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()
+ }
+}