Skip to content

Commit f3c3787

Browse files
committed
debug/pe: fix OOM caused by huge NumberOfSymbols
Creating a new PE file with `NewFile()` in package `debug/pe` would meet out-of0memory if `NumberOfSymbols` field of `COFFSymbol` struct is a huge value. In this PR, we check if `NumberOfSymbols` excesses the maximun size of input data. If so, a new error "fail to read symbol table: NumberOfSymbols too large" is returned. Fixes golang#43827
1 parent 928bda4 commit f3c3787

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

src/debug/pe/symbol.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package pe
66

77
import (
8+
"bytes"
89
"encoding/binary"
910
"fmt"
1011
"io"
@@ -33,8 +34,14 @@ func readCOFFSymbols(fh *FileHeader, r io.ReadSeeker) ([]COFFSymbol, error) {
3334
if err != nil {
3435
return nil, fmt.Errorf("fail to seek to symbol table: %v", err)
3536
}
37+
38+
buf := bytes.Buffer{}
39+
_, err = io.CopyN(&buf, r, COFFSymbolSize*int64(fh.NumberOfSymbols))
40+
if err != nil {
41+
return nil, fmt.Errorf("fail to read symbol table: NumberOfSymbols too large")
42+
}
3643
syms := make([]COFFSymbol, fh.NumberOfSymbols)
37-
err = binary.Read(r, binary.LittleEndian, syms)
44+
err = binary.Read(&buf, binary.LittleEndian, syms)
3845
if err != nil {
3946
return nil, fmt.Errorf("fail to read symbol table: %v", err)
4047
}

0 commit comments

Comments
 (0)