Skip to content

LockedBuffer.Copy() crashes with access violation on Windows when buffer is valid and alive #165

@xMinhx

Description

@xMinhx

Describe the bug
Calling (*memguard.LockedBuffer).Copy() results in a fatal access violation on Windows, even though the buffer is non-nil, alive (IsAlive() returns true), and accessed under a sync.RWMutex that guards against concurrent Destroy() or Swap().

Replacing .Copy() with copy(out, buf.Bytes()) avoids the issue.

To Reproduce
Steps to reproduce the behavior:

Create a LockedBuffer using memguard.NewBufferFromBytes
Call .Copy() into equally sized destination buffer

-> panic or access violation

buf := memguard.NewBufferFromBytes([]byte("test"))
defer buf.Destroy()

out := make([]byte, buf.Size())
buf.Copy(out)

Expected behaviour
Copy() should copy memory from a valid, non-destroyed buffer.
It should not crash when:

  • The buffer is alive
  • The buffer size is non-zero

System:
OS and Kernel Versions: Microsoft Windows [Version 10.0.26100.3775]
Memguard Version: v0.22.5
Go Version: go1.24.1 (Windows amd64)

Additional context

  • Tried with Mutex
  • No concurrent calls to .Destroy() or .Swap()
  • .IsAlive() returns true before .Copy()
  • .Bytes() works fine under same locking conditions
  • Switching to append([]byte(nil), buf.Bytes()...) avoids crash completely.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions