From 97939685232321ccd4759622d8063d913f6f549f Mon Sep 17 00:00:00 2001 From: Sven Rebhan Date: Fri, 3 Nov 2023 14:34:57 +0100 Subject: [PATCH] Fallback to only wipe the inner memory on error --- core/memallocator_page.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/memallocator_page.go b/core/memallocator_page.go index dad79c7..c3e2a87 100644 --- a/core/memallocator_page.go +++ b/core/memallocator_page.go @@ -1,6 +1,8 @@ package core import ( + "fmt" + "os" "sync" "unsafe" @@ -188,8 +190,13 @@ func (a *pageAllocator) newPageObject(size int) (*pageObject, error) { func (o *pageObject) wipe() error { // Make all of the memory readable and writable. + var partialUnprotect bool if err := memcall.Protect(o.memory, memcall.ReadWrite()); err != nil { - return err + partialUnprotect = true + if partialErr := memcall.Protect(o.inner, memcall.ReadWrite()); partialErr != nil { + fmt.Fprintf(os.Stderr, "!WARNING: failed to wipe immutable data at address %p: %v", &o.data, partialErr) + return err + } } // Wipe data field. @@ -201,8 +208,10 @@ func (o *pageObject) wipe() error { return ErrBufferOverflow } - // Wipe the memory. - Wipe(o.memory) + // Wipe the whole memory region if we were able to switch it to mutable. + if !partialUnprotect { + Wipe(o.memory) + } // Unlock pages locked into memory. if err := memcall.Unlock(o.inner); err != nil {