@@ -8,6 +8,7 @@ package unix_test
88
99import (
1010 "testing"
11+ "unsafe"
1112
1213 "golang.org/x/sys/unix"
1314)
@@ -44,3 +45,32 @@ func TestMremap(t *testing.T) {
4445 t .Fatalf ("remapping to a fixed address; got %v, want %v" , err , unix .EINVAL )
4546 }
4647}
48+
49+ func TestMremapPtr (t * testing.T ) {
50+ mmapProt := unix .PROT_NONE
51+ mmapPtrProt := unix .PROT_READ | unix .PROT_WRITE
52+ b , err := unix .Mmap (- 1 , 0 , 2 * unix .Getpagesize (), mmapProt , unix .MAP_ANON | unix .MAP_PRIVATE )
53+ if err != nil {
54+ t .Fatalf ("Mmap: %v" , err )
55+ }
56+ if _ , err := unix .MmapPtr (- 1 , 0 , unsafe .Pointer (& b [0 ]), uintptr (unix .Getpagesize ()),
57+ mmapPtrProt , unix .MAP_ANON | unix .MAP_PRIVATE | unix .MAP_FIXED ); err != nil {
58+ t .Fatalf ("MmapPtr: %v" , err )
59+ }
60+
61+ b [0 ] = 42
62+
63+ if _ , err := unix .MremapPtr (
64+ unsafe .Pointer (& b [0 ]), uintptr (unix .Getpagesize ()),
65+ unsafe .Pointer (& b [unix .Getpagesize ()]), uintptr (unix .Getpagesize ()),
66+ unix .MremapFixed | unix .MremapMaymove ); err != nil {
67+ t .Fatalf ("MremapPtr: %v" , err )
68+ }
69+ if got := b [unix .Getpagesize ()]; got != 42 {
70+ t .Errorf ("got %d, want 42" , got )
71+ }
72+
73+ if err := unix .Munmap (b ); err != nil {
74+ t .Fatalf ("Munmap: %v" , err )
75+ }
76+ }
0 commit comments