Handle NULL addrs / empty OP stacks

This commit is contained in:
Derek Parker
2015-05-07 16:55:06 -05:00
parent df78a294e4
commit 5a408e7054
3 changed files with 17 additions and 0 deletions

View File

@ -3,6 +3,7 @@ package op
import ( import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"errors"
"fmt" "fmt"
"github.com/derekparker/delve/dwarf/util" "github.com/derekparker/delve/dwarf/util"
@ -42,6 +43,10 @@ func ExecuteStackProgram(cfa int64, instructions []byte) (int64, error) {
} }
} }
if len(stack) == 0 {
return 0, errors.New("empty OP stack")
}
return stack[len(stack)-1], nil return stack[len(stack)-1], nil
} }

View File

@ -304,6 +304,9 @@ func (dbp *DebuggedProcess) setChanRecvBreakpoints() (int, error) {
if g.ChanRecvBlocked() { if g.ChanRecvBlocked() {
ret, err := g.chanRecvReturnAddr(dbp) ret, err := g.chanRecvReturnAddr(dbp)
if err != nil { if err != nil {
if _, ok := err.(NullAddrError); ok {
continue
}
return 0, err return 0, err
} }
if _, err = dbp.TempBreak(ret); err != nil { if _, err = dbp.TempBreak(ret); err != nil {

View File

@ -26,6 +26,12 @@ func (thread *ThreadContext) ReturnAddress() (uint64, error) {
return locations[0].addr, nil return locations[0].addr, nil
} }
type NullAddrError struct{}
func (n NullAddrError) Error() string {
return "NULL address"
}
func (dbp *DebuggedProcess) stacktrace(pc, sp uint64, depth int) ([]stackLocation, error) { func (dbp *DebuggedProcess) stacktrace(pc, sp uint64, depth int) ([]stackLocation, error) {
var ( var (
ret = pc ret = pc
@ -41,6 +47,9 @@ func (dbp *DebuggedProcess) stacktrace(pc, sp uint64, depth int) ([]stackLocatio
} }
btoffset += fde.ReturnAddressOffset(ret) btoffset += fde.ReturnAddressOffset(ret)
retaddr = uintptr(int64(sp) + btoffset + (i * 8)) retaddr = uintptr(int64(sp) + btoffset + (i * 8))
if retaddr == 0 {
return nil, NullAddrError{}
}
_, err = readMemory(dbp.CurrentThread, retaddr, data) _, err = readMemory(dbp.CurrentThread, retaddr, data)
if err != nil { if err != nil {
return nil, err return nil, err