From cee277ca104701300c506fd5f689b6817481c72a Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 2 Apr 2019 07:33:37 +0200 Subject: ringlogger: give unprivd access via inheritable mapping handle Signed-off-by: Jason A. Donenfeld --- ringlogger/ringlogger_windows.go | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'ringlogger') 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 } -- cgit v1.2.3-59-g8ed1b