]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: fix mmapping OutBuf on windows
authorJeremy Faller <jeremy@golang.org>
Mon, 30 Mar 2020 14:45:26 +0000 (10:45 -0400)
committerJeremy Faller <jeremy@golang.org>
Wed, 1 Apr 2020 15:46:28 +0000 (15:46 +0000)
We got the permissions wrong on the mmapped region.

Change-Id: Ica6372fd9d9a787ab20a763e5785fb9fb34ff623
Reviewed-on: https://go-review.googlesource.com/c/go/+/226366
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/link/internal/ld/outbuf_test.go [new file with mode: 0644]
src/cmd/link/internal/ld/outbuf_windows.go

diff --git a/src/cmd/link/internal/ld/outbuf_test.go b/src/cmd/link/internal/ld/outbuf_test.go
new file mode 100644 (file)
index 0000000..512238f
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ld
+
+import (
+       "os"
+       "runtime"
+       "testing"
+)
+
+// TestMMap ensures that we can actually mmap on every supported platform.
+func TestMMap(t *testing.T) {
+       switch runtime.GOOS {
+       default:
+               t.Skip("unsupported OS")
+       case "darwin", "dragonfly", "freebsd", "linux", "openbsd", "windows":
+       }
+       filename := "foo.out"
+       ob := NewOutBuf(nil)
+       if err := ob.Open(filename); err != nil {
+               t.Errorf("error opening file: %v", err)
+       }
+       defer os.RemoveAll(filename)
+       defer ob.Close()
+       if err := ob.Mmap(1 << 20); err != nil {
+               t.Errorf("error mmapping file %v", err)
+       }
+}
index e7cda75fc047014eee4c7187594546cf466b7b4e..f745a5cb22eebdb86eebc3f2f94d05a95c358403 100644 (file)
@@ -17,7 +17,7 @@ func (out *OutBuf) Mmap(filesize uint64) error {
        }
 
        low, high := uint32(filesize), uint32(filesize>>32)
-       fmap, err := syscall.CreateFileMapping(syscall.Handle(out.f.Fd()), nil, syscall.PAGE_READONLY, high, low, nil)
+       fmap, err := syscall.CreateFileMapping(syscall.Handle(out.f.Fd()), nil, syscall.PAGE_READWRITE, high, low, nil)
        if err != nil {
                return err
        }