mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 18:57:18 +08:00 
			
		
		
		
	 6c7ad4059b
			
		
	
	6c7ad4059b
	
	
	
		
			
			If uninitialized memory is read loadArrayValues could try to call cacheMemory with a negative size, which could cause a 'makeslice: len out of range' panic. Fixes #354 (partial)
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package proc
 | |
| 
 | |
| const cacheEnabled = true
 | |
| 
 | |
| type memoryReadWriter interface {
 | |
| 	readMemory(addr uintptr, size int) (data []byte, err error)
 | |
| 	writeMemory(addr uintptr, data []byte) (written int, err error)
 | |
| }
 | |
| 
 | |
| type memCache struct {
 | |
| 	cacheAddr uintptr
 | |
| 	cache     []byte
 | |
| 	mem       memoryReadWriter
 | |
| }
 | |
| 
 | |
| func (m *memCache) contains(addr uintptr, size int) bool {
 | |
| 	return addr >= m.cacheAddr && (addr+uintptr(size)) <= (m.cacheAddr+uintptr(len(m.cache)))
 | |
| }
 | |
| 
 | |
| func (m *memCache) readMemory(addr uintptr, size int) (data []byte, err error) {
 | |
| 	if m.contains(addr, size) {
 | |
| 		d := make([]byte, size)
 | |
| 		copy(d, m.cache[addr-m.cacheAddr:])
 | |
| 		return d, nil
 | |
| 	}
 | |
| 
 | |
| 	return m.mem.readMemory(addr, size)
 | |
| }
 | |
| 
 | |
| func (m *memCache) writeMemory(addr uintptr, data []byte) (written int, err error) {
 | |
| 	return m.mem.writeMemory(addr, data)
 | |
| }
 | |
| 
 | |
| func cacheMemory(mem memoryReadWriter, addr uintptr, size int) memoryReadWriter {
 | |
| 	if !cacheEnabled {
 | |
| 		return mem
 | |
| 	}
 | |
| 	if size <= 0 {
 | |
| 		return mem
 | |
| 	}
 | |
| 	if cacheMem, isCache := mem.(*memCache); isCache {
 | |
| 		if cacheMem.contains(addr, size) {
 | |
| 			return mem
 | |
| 		} else {
 | |
| 			cache, err := cacheMem.mem.readMemory(addr, size)
 | |
| 			if err != nil {
 | |
| 				return mem
 | |
| 			}
 | |
| 			return &memCache{addr, cache, mem}
 | |
| 		}
 | |
| 	}
 | |
| 	cache, err := mem.readMemory(addr, size)
 | |
| 	if err != nil {
 | |
| 		return mem
 | |
| 	}
 | |
| 	return &memCache{addr, cache, mem}
 | |
| }
 |