Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf342b71

Browse files
Prevent huge allocations when parsing goes wrong
There are no kind words to talk about how I feel aboutthe `debug/pe` package right now. What's very clear isthat it was never intended for arbitrary inputs.Anyway, these changes make us stray further from upstream,but when I look at upstream, I'm okay with it.
1 parent308c377 commitf342b71

File tree

4 files changed

+33
-41
lines changed

4 files changed

+33
-41
lines changed

‎pe/file.go‎

Lines changed: 15 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"encoding/binary"
1111
"fmt"
1212
"io"
13-
"os"
1413

1514
"github.com/pkg/errors"
1615
)
@@ -30,33 +29,7 @@ type File struct {
3029
closer io.Closer
3130
readerAt io.ReaderAt
3231
baseint64
33-
}
34-
35-
// Open opens the named file using os.Open and prepares it for use as a PE binary.
36-
funcOpen(namestring) (*File,error) {
37-
f,err:=os.Open(name)
38-
iferr!=nil {
39-
returnnil,err
40-
}
41-
ff,err:=NewFile(f)
42-
iferr!=nil {
43-
f.Close()
44-
returnnil,err
45-
}
46-
ff.closer=f
47-
returnff,nil
48-
}
49-
50-
// Close closes the File.
51-
// If the File was created using NewFile directly instead of Open,
52-
// Close has no effect.
53-
func (f*File)Close()error {
54-
varerrerror
55-
iff.closer!=nil {
56-
err=f.closer.Close()
57-
f.closer=nil
58-
}
59-
returnerr
32+
sizeint64
6033
}
6134

6235
var (
@@ -67,10 +40,11 @@ var (
6740
// TODO(brainman): add Load function, as a replacement for NewFile, that does not call removeAuxSymbols (for performance)
6841

6942
// NewFile creates a new File for accessing a PE binary in an underlying reader.
70-
funcNewFile(r io.ReaderAt) (*File,error) {
43+
funcNewFile(r io.ReaderAt,sizeint64) (*File,error) {
7144
f:=new(File)
45+
f.size=size
7246
f.readerAt=r
73-
sr:=io.NewSectionReader(r,0,1<<63-1)
47+
sr:=io.NewSectionReader(r,0,size)
7448

7549
vardosheader [96]byte
7650
if_,err:=r.ReadAt(dosheader[0:],0);err!=nil {
@@ -80,16 +54,22 @@ func NewFile(r io.ReaderAt) (*File, error) {
8054
ifdosheader[0]=='M'&&dosheader[1]=='Z' {
8155
signoff:=int64(binary.LittleEndian.Uint32(dosheader[0x3c:]))
8256
varsign [4]byte
83-
r.ReadAt(sign[:],signoff)
57+
_,err:=r.ReadAt(sign[:],signoff)
58+
iferr!=nil {
59+
returnnil,err
60+
}
8461
if!(sign[0]=='P'&&sign[1]=='E'&&sign[2]==0&&sign[3]==0) {
8562
returnnil,fmt.Errorf("Invalid PE COFF file signature of %v.",sign)
8663
}
8764
base=signoff+4
8865
}else {
8966
base=int64(0)
9067
}
91-
sr.Seek(base,seekStart)
92-
iferr:=binary.Read(sr,binary.LittleEndian,&f.FileHeader);err!=nil {
68+
_,err:=sr.Seek(base,seekStart)
69+
iferr!=nil {
70+
returnnil,err
71+
}
72+
iferr=binary.Read(sr,binary.LittleEndian,&f.FileHeader);err!=nil {
9373
returnnil,err
9474
}
9575
switchf.FileHeader.Machine {
@@ -98,16 +78,14 @@ func NewFile(r io.ReaderAt) (*File, error) {
9878
returnnil,fmt.Errorf("Unrecognised COFF file header machine value of 0x%x.",f.FileHeader.Machine)
9979
}
10080

101-
varerrerror
102-
10381
// Read string table.
104-
f.StringTable,err=readStringTable(&f.FileHeader,sr)
82+
f.StringTable,err=readStringTable(f,&f.FileHeader,sr)
10583
iferr!=nil {
10684
returnnil,err
10785
}
10886

10987
// Read symbol table.
110-
f.COFFSymbols,err=readCOFFSymbols(&f.FileHeader,sr)
88+
f.COFFSymbols,err=readCOFFSymbols(f,&f.FileHeader,sr)
11189
iferr!=nil {
11290
returnnil,err
11391
}

‎pe/string.go‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"encoding/binary"
99
"fmt"
1010
"io"
11+
12+
"github.com/itchio/headway/united"
1113
)
1214

1315
// cstring converts ASCII byte sequence b to string.
@@ -22,13 +24,13 @@ func cstring(b []byte) string {
2224
// StringTable is a COFF string table.
2325
typeStringTable []byte
2426

25-
funcreadStringTable(fh*FileHeader,r io.ReadSeeker) (StringTable,error) {
27+
funcreadStringTable(f*File,fh*FileHeader,r io.ReadSeeker) (StringTable,error) {
2628
// COFF string table is located right after COFF symbol table.
2729
iffh.PointerToSymbolTable<=0 {
2830
returnnil,nil
2931
}
3032
offset:=fh.PointerToSymbolTable+COFFSymbolSize*fh.NumberOfSymbols
31-
_,err:=r.Seek(int64(offset),seekStart)
33+
_,err:=r.Seek(int64(offset),io.SeekStart)
3234
iferr!=nil {
3335
returnnil,fmt.Errorf("fail to seek to string table: %v",err)
3436
}
@@ -37,11 +39,18 @@ func readStringTable(fh *FileHeader, r io.ReadSeeker) (StringTable, error) {
3739
iferr!=nil {
3840
returnnil,fmt.Errorf("fail to read string table length: %v",err)
3941
}
42+
43+
varendint64=int64(offset)+int64(l)
44+
ifend>=f.size {
45+
returnnil,fmt.Errorf("debug/pe thinks the string table is at %s, but the file is only %s",united.FormatBytes(end),united.FormatBytes(f.size))
46+
}
47+
4048
// string table length includes itself
4149
ifl<=4 {
4250
returnnil,nil
4351
}
4452
l-=4
53+
4554
buf:=make([]byte,l)
4655
_,err=io.ReadFull(r,buf)
4756
iferr!=nil {

‎pe/symbol.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type COFFSymbol struct {
2222
NumberOfAuxSymbolsuint8
2323
}
2424

25-
funcreadCOFFSymbols(fh*FileHeader,r io.ReadSeeker) ([]COFFSymbol,error) {
25+
funcreadCOFFSymbols(f*File,fh*FileHeader,r io.ReadSeeker) ([]COFFSymbol,error) {
2626
iffh.PointerToSymbolTable==0 {
2727
returnnil,nil
2828
}

‎probe.go‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ type ProbeParams struct {
1919
funcProbe(file eos.File,paramsProbeParams) (*PeInfo,error) {
2020
consumer:=params.Consumer
2121

22-
pf,err:=pe.NewFile(file)
22+
stats,err:=file.Stat()
23+
iferr!=nil {
24+
returnnil,errors.WithStack(err)
25+
}
26+
27+
pf,err:=pe.NewFile(file,stats.Size())
2328
iferr!=nil {
2429
returnnil,errors.WithStack(err)
2530
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp