1
0
mirror of https://github.com/golang/go synced 2024-11-12 10:00:25 -07:00

Decode overlapping section names correctly.

R=rsc
APPROVED=rsc
DELTA=23  (14 added, 8 deleted, 1 changed)
OCL=33699
CL=33705
This commit is contained in:
Austin Clements 2009-08-21 18:30:20 -07:00
parent bd65739bc2
commit fc18391209

View File

@ -168,18 +168,10 @@ func NewElf(r io.ReadSeeker) (*Elf, os.Error) {
}
blob := make([]byte, e.Sections[shstrndx].Size);
n, err = io.ReadFull(r, blob);
strings := make(map[uint32] string);
strStart := uint32(0);
for i, c := range blob {
if c == 0 {
strings[strStart] = string(blob[strStart:i]);
strStart = uint32(i+1);
}
}
for i, s := range e.Sections {
var ok bool;
s.Name, ok = strings[secNames[i]];
s.Name, ok = getString(blob, int(secNames[i]));
if !ok {
return nil, &FormatError{start + shoff + int64(i*shentsize), "bad section name", secNames[i]};
}
@ -188,6 +180,20 @@ func NewElf(r io.ReadSeeker) (*Elf, os.Error) {
return e, nil;
}
// getString extracts a string from an ELF string table.
func getString(section []byte, index int) (string, bool) {
if index < 0 || index >= len(section) {
return "", false;
}
for end := index; end < len(section); end++ {
if section[end] == 0 {
return string(section[index:end]), true;
}
}
return "", false;
}
// Section returns a section with the given name, or nil if no such
// section exists.
func (e *Elf) Section(name string) *Section {