diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-04-02 07:33:37 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-04-02 07:33:37 +0200 |
commit | d28cd0100b89ef182c5c7b39ec1b6b90062647b7 (patch) | |
tree | b8f29db3d80017d3d4b0199f1b0cfc312d69dd81 /ringlogger | |
parent | ui: remove spacer that was only needed in a container other than ScrollView (diff) | |
download | wireguard-windows-d28cd0100b89ef182c5c7b39ec1b6b90062647b7.tar.xz wireguard-windows-d28cd0100b89ef182c5c7b39ec1b6b90062647b7.zip |
ringlogger: give unprivd access via inheritable mapping handle
Diffstat (limited to 'ringlogger')
-rw-r--r-- | ringlogger/ringlogger_windows.go | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/ringlogger/ringlogger_windows.go b/ringlogger/ringlogger_windows.go index 1a49570c..f0e7e50a 100644 --- a/ringlogger/ringlogger_windows.go +++ b/ringlogger/ringlogger_windows.go @@ -12,6 +12,7 @@ import ( "io" "os" "runtime" + "strconv" "sync/atomic" "time" "unsafe" @@ -54,12 +55,21 @@ func NewRinglogger(filename string, tag string) (*Ringlogger, error) { if err != nil { return nil, err } - view, err := windows.MapViewOfFile(mapping, windows.FILE_MAP_WRITE, 0, 0, 0) + rl, err := NewRingloggerFromMappingHandle(mapping, tag) if err != nil { return nil, err } + rl.file = file + return rl, nil +} + +func NewRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string) (*Ringlogger, error) { + view, err := windows.MapViewOfFile(mappingHandle, windows.FILE_MAP_WRITE, 0, 0, 0) if err != nil { - windows.CloseHandle(mapping) + return nil, err + } + if err != nil { + windows.CloseHandle(mappingHandle) return nil, err } log := (*logMem)(unsafe.Pointer(view)) @@ -74,14 +84,21 @@ func NewRinglogger(filename string, tag string) (*Ringlogger, error) { rl := &Ringlogger{ tag: tag, - file: file, - mapping: mapping, + mapping: mappingHandle, log: log, } 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 + } + 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() @@ -202,6 +219,11 @@ func (rl *Ringlogger) Close() error { return nil } -func (rl *Ringlogger) Filename() string { - return rl.file.Name() +func (rl *Ringlogger) ExportInheritableMappingHandleStr() (str string, err error) { + err = windows.SetHandleInformation(rl.mapping, windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) + if err != nil { + return + } + str = strconv.FormatUint(uint64(rl.mapping), 10) + return } |