From 7f53117ea94b51413efadfe3d7a4e34615d5ef2b Mon Sep 17 00:00:00 2001 From: aarzilli Date: Mon, 19 Nov 2018 14:22:43 +0100 Subject: [PATCH] proc: do not panic if we can't satisfy a composite location When a location expression requests a register check that we have as many bytes in the register as requested and if we don't report the error. Updates #1416 --- pkg/proc/mem.go | 8 ++++++-- pkg/proc/variables.go | 5 ++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pkg/proc/mem.go b/pkg/proc/mem.go index a5aa469b..61f8e726 100644 --- a/pkg/proc/mem.go +++ b/pkg/proc/mem.go @@ -2,6 +2,7 @@ package proc import ( "errors" + "fmt" "github.com/derekparker/delve/pkg/dwarf/op" ) @@ -93,7 +94,7 @@ type compositeMemory struct { data []byte } -func newCompositeMemory(mem MemoryReadWriter, regs op.DwarfRegisters, pieces []op.Piece) *compositeMemory { +func newCompositeMemory(mem MemoryReadWriter, regs op.DwarfRegisters, pieces []op.Piece) (*compositeMemory, error) { cmem := &compositeMemory{realmem: mem, regs: regs, pieces: pieces, data: []byte{}} for _, piece := range pieces { if piece.IsRegister { @@ -102,6 +103,9 @@ func newCompositeMemory(mem MemoryReadWriter, regs op.DwarfRegisters, pieces []o if sz == 0 && len(pieces) == 1 { sz = len(reg) } + if sz > len(reg) { + return nil, fmt.Errorf("could not read %d bytes from register %d (size: %d)", sz, piece.RegNum, len(reg)) + } cmem.data = append(cmem.data, reg[:sz]...) } else { buf := make([]byte, piece.Size) @@ -109,7 +113,7 @@ func newCompositeMemory(mem MemoryReadWriter, regs op.DwarfRegisters, pieces []o cmem.data = append(cmem.data, buf...) } } - return cmem + return cmem, nil } func (mem *compositeMemory) ReadMemory(data []byte, addr uintptr) (int, error) { diff --git a/pkg/proc/variables.go b/pkg/proc/variables.go index 91e1f2f0..1b4d6491 100644 --- a/pkg/proc/variables.go +++ b/pkg/proc/variables.go @@ -908,7 +908,10 @@ func (scope *EvalScope) extractVarInfoFromEntry(varEntry *dwarf.Entry) (*Variabl mem := scope.Mem if pieces != nil { addr = fakeAddress - mem = newCompositeMemory(scope.Mem, scope.Regs, pieces) + mem, err = newCompositeMemory(scope.Mem, scope.Regs, pieces) + if mem == nil { + mem = scope.Mem + } } v := scope.newVariable(n, uintptr(addr), t, mem) -- GitLab