diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-05-07 08:15:39 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-05-07 08:15:39 +0200 |
commit | a45f68e99663e871b0b53239fff6be98615872fb (patch) | |
tree | 9a6ec44e42f8eb9e9bd2bca00db6ce2a80f249ca /ringlogger | |
parent | installer: fix tag style (diff) | |
download | wireguard-windows-a45f68e99663e871b0b53239fff6be98615872fb.tar.xz wireguard-windows-a45f68e99663e871b0b53239fff6be98615872fb.zip |
ringlogger: export R/O handle for UI process
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'ringlogger')
-rw-r--r-- | ringlogger/ringlogger_windows.go | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/ringlogger/ringlogger_windows.go b/ringlogger/ringlogger_windows.go index 1e0b4b76..4c142e6a 100644 --- a/ringlogger/ringlogger_windows.go +++ b/ringlogger/ringlogger_windows.go @@ -36,10 +36,11 @@ type logMem struct { } type Ringlogger struct { - tag string - file *os.File - mapping windows.Handle - log *logMem + tag string + file *os.File + mapping windows.Handle + log *logMem + readOnly bool } func NewRinglogger(filename string, tag string) (*Ringlogger, error) { @@ -55,7 +56,7 @@ func NewRinglogger(filename string, tag string) (*Ringlogger, error) { if err != nil { return nil, err } - rl, err := NewRingloggerFromMappingHandle(mapping, tag) + rl, err := newRingloggerFromMappingHandle(mapping, tag, windows.FILE_MAP_WRITE) if err != nil { return nil, err } @@ -63,8 +64,16 @@ func NewRinglogger(filename string, tag string) (*Ringlogger, error) { return rl, nil } -func NewRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string) (*Ringlogger, error) { - view, err := windows.MapViewOfFile(mappingHandle, windows.FILE_MAP_WRITE, 0, 0, 0) +func NewRingloggerFromInheritedMappingHandle(handleStr string, tag string) (*Ringlogger, error) { + handle, err := strconv.ParseUint(handleStr, 10, 64) + if err != nil { + return nil, err + } + return newRingloggerFromMappingHandle(windows.Handle(handle), tag, windows.FILE_MAP_READ) +} + +func newRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string, access uint32) (*Ringlogger, error) { + view, err := windows.MapViewOfFile(mappingHandle, access, 0, 0, 0) if err != nil { return nil, err } @@ -83,23 +92,20 @@ func NewRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string) (* } rl := &Ringlogger{ - tag: tag, - mapping: mappingHandle, - log: log, + tag: tag, + mapping: mappingHandle, + log: log, + readOnly: access&windows.FILE_MAP_WRITE == 0, } runtime.SetFinalizer(rl, (*Ringlogger).Close) return rl, nil } -func NewRingloggerFromInheritedMappingHandle(handleStr string, tag string) (*Ringlogger, error) { - handle, err := strconv.ParseUint(handleStr, 10, 64) - if err != nil { - return nil, err +func (rl *Ringlogger) Write(p []byte) (n int, err error) { + if rl.readOnly { + return 0, io.ErrShortWrite } - return NewRingloggerFromMappingHandle(windows.Handle(handle), tag) -} -func (rl *Ringlogger) Write(p []byte) (n int, err error) { // Race: This isn't synchronized with the fetch_add below, so items might be slightly out of order. ts := time.Now().UnixNano() @@ -219,11 +225,17 @@ func (rl *Ringlogger) Close() error { return nil } -func (rl *Ringlogger) ExportInheritableMappingHandleStr() (str string, err error) { - err = windows.SetHandleInformation(rl.mapping, windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) +func (rl *Ringlogger) ExportInheritableMappingHandleStr() (str string, handleToClose windows.Handle, err error) { + handleToClose, err = windows.CreateFileMapping(windows.Handle(rl.file.Fd()), nil, windows.PAGE_READONLY, 0, 0, nil) + if err != nil { + return + } + err = windows.SetHandleInformation(handleToClose, windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) if err != nil { + windows.Close(handleToClose) + handleToClose = 0 return } - str = strconv.FormatUint(uint64(rl.mapping), 10) + str = strconv.FormatUint(uint64(handleToClose), 10) return } |