Fix panic when size 0 passed to malloc
Этот коммит содержится в:
		
							родитель
							
								
									c759e6fc2d
								
							
						
					
					
						коммит
						b731919f97
					
				
					 2 изменённых файлов: 37 добавлений и 0 удалений
				
			
		| 
						 | 
				
			
			@ -13,6 +13,9 @@ var allocs = make(map[uintptr][]byte)
 | 
			
		|||
 | 
			
		||||
//export malloc
 | 
			
		||||
func libc_malloc(size uintptr) unsafe.Pointer {
 | 
			
		||||
	if size == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	ptr := unsafe.Pointer(&buf[0])
 | 
			
		||||
	allocs[uintptr(ptr)] = buf
 | 
			
		||||
| 
						 | 
				
			
			@ -39,6 +42,11 @@ func libc_calloc(nmemb, size uintptr) unsafe.Pointer {
 | 
			
		|||
 | 
			
		||||
//export realloc
 | 
			
		||||
func libc_realloc(oldPtr unsafe.Pointer, size uintptr) unsafe.Pointer {
 | 
			
		||||
	if size == 0 {
 | 
			
		||||
		libc_free(oldPtr)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// It's hard to optimize this to expand the current buffer with our GC, but
 | 
			
		||||
	// it is theoretically possible. For now, just always allocate fresh.
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -125,3 +125,32 @@ func TestMallocFree(t *testing.T) {
 | 
			
		|||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMallocEmpty(t *testing.T) {
 | 
			
		||||
	ptr := libc_malloc(0)
 | 
			
		||||
	if ptr != nil {
 | 
			
		||||
		t.Errorf("expected nil pointer, got %p", ptr)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCallocEmpty(t *testing.T) {
 | 
			
		||||
	ptr := libc_calloc(0, 1)
 | 
			
		||||
	if ptr != nil {
 | 
			
		||||
		t.Errorf("expected nil pointer, got %p", ptr)
 | 
			
		||||
	}
 | 
			
		||||
	ptr = libc_calloc(1, 0)
 | 
			
		||||
	if ptr != nil {
 | 
			
		||||
		t.Errorf("expected nil pointer, got %p", ptr)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestReallocEmpty(t *testing.T) {
 | 
			
		||||
	ptr := libc_malloc(1)
 | 
			
		||||
	if ptr == nil {
 | 
			
		||||
		t.Error("expected pointer but was nil")
 | 
			
		||||
	}
 | 
			
		||||
	ptr = libc_realloc(ptr, 0)
 | 
			
		||||
	if ptr != nil {
 | 
			
		||||
		t.Errorf("expected nil pointer, got %p", ptr)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче