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:
parent
bd65739bc2
commit
fc18391209
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user