internal/outcome/shim: EOF as exit request fallback
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Test / Create distribution (push) Successful in 35s
				
			
		
			
				
	
				Test / Sandbox (push) Successful in 55s
				
			
		
			
				
	
				Test / Sandbox (race detector) (push) Successful in 53s
				
			
		
			
				
	
				Test / Hpkg (push) Successful in 53s
				
			
		
			
				
	
				Test / Hakurei (race detector) (push) Successful in 1m1s
				
			
		
			
				
	
				Test / Hakurei (push) Successful in 1m3s
				
			
		
			
				
	
				Test / Flake checks (push) Successful in 1m34s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 35s
				
			Test / Sandbox (push) Successful in 55s
				
			Test / Sandbox (race detector) (push) Successful in 53s
				
			Test / Hpkg (push) Successful in 53s
				
			Test / Hakurei (race detector) (push) Successful in 1m1s
				
			Test / Hakurei (push) Successful in 1m3s
				
			Test / Flake checks (push) Successful in 1m34s
				
			In some cases the signal might be delivered before the signal handler is installed, and synchronising against such a case is too expensive. Instead, use the pipe being closed as a fallback to the regular exit request. This change also moves installation of the signal handler early. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
		
							parent
							
								
									2ba599b399
								
							
						
					
					
						commit
						6931ad95c3
					
				@ -32,6 +32,8 @@ type syscallDispatcher interface {
 | 
				
			|||||||
	// just synchronising access is not enough, as this is for test instrumentation.
 | 
						// just synchronising access is not enough, as this is for test instrumentation.
 | 
				
			||||||
	new(f func(k syscallDispatcher, msg message.Msg))
 | 
						new(f func(k syscallDispatcher, msg message.Msg))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// getppid provides [os.Getppid].
 | 
				
			||||||
 | 
						getppid() int
 | 
				
			||||||
	// getpid provides [os.Getpid].
 | 
						// getpid provides [os.Getpid].
 | 
				
			||||||
	getpid() int
 | 
						getpid() int
 | 
				
			||||||
	// getuid provides [os.Getuid].
 | 
						// getuid provides [os.Getuid].
 | 
				
			||||||
@ -108,6 +110,7 @@ type direct struct{ msg message.Msg }
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (k direct) new(f func(k syscallDispatcher, msg message.Msg)) { go f(k, k.msg) }
 | 
					func (k direct) new(f func(k syscallDispatcher, msg message.Msg)) { go f(k, k.msg) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (direct) getppid() int                               { return os.Getppid() }
 | 
				
			||||||
func (direct) getpid() int                                { return os.Getpid() }
 | 
					func (direct) getpid() int                                { return os.Getpid() }
 | 
				
			||||||
func (direct) getuid() int                                { return os.Getuid() }
 | 
					func (direct) getuid() int                                { return os.Getuid() }
 | 
				
			||||||
func (direct) getgid() int                                { return os.Getgid() }
 | 
					func (direct) getgid() int                                { return os.Getgid() }
 | 
				
			||||||
 | 
				
			|||||||
@ -331,9 +331,10 @@ func (k *kstub) new(f func(k syscallDispatcher, msg message.Msg)) {
 | 
				
			|||||||
	k.New(func(k syscallDispatcher) { f(k, k.(*kstub)) })
 | 
						k.New(func(k syscallDispatcher) { f(k, k.(*kstub)) })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (k *kstub) getpid() int { k.Helper(); return k.Expects("getpid").Ret.(int) }
 | 
					func (k *kstub) getppid() int { k.Helper(); return k.Expects("getppid").Ret.(int) }
 | 
				
			||||||
func (k *kstub) getuid() int { k.Helper(); return k.Expects("getuid").Ret.(int) }
 | 
					func (k *kstub) getpid() int  { k.Helper(); return k.Expects("getpid").Ret.(int) }
 | 
				
			||||||
func (k *kstub) getgid() int { k.Helper(); return k.Expects("getgid").Ret.(int) }
 | 
					func (k *kstub) getuid() int  { k.Helper(); return k.Expects("getuid").Ret.(int) }
 | 
				
			||||||
 | 
					func (k *kstub) getgid() int  { k.Helper(); return k.Expects("getgid").Ret.(int) }
 | 
				
			||||||
func (k *kstub) lookupEnv(key string) (string, bool) {
 | 
					func (k *kstub) lookupEnv(key string) (string, bool) {
 | 
				
			||||||
	k.Helper()
 | 
						k.Helper()
 | 
				
			||||||
	expect := k.Expects("lookupEnv")
 | 
						expect := k.Expects("lookupEnv")
 | 
				
			||||||
 | 
				
			|||||||
@ -700,9 +700,10 @@ type stubNixOS struct {
 | 
				
			|||||||
	panicDispatcher
 | 
						panicDispatcher
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (k *stubNixOS) getpid() int { return 0xdeadbeef }
 | 
					func (k *stubNixOS) getppid() int { return 0xbad }
 | 
				
			||||||
func (k *stubNixOS) getuid() int { return 1971 }
 | 
					func (k *stubNixOS) getpid() int  { return 0xdeadbeef }
 | 
				
			||||||
func (k *stubNixOS) getgid() int { return 100 }
 | 
					func (k *stubNixOS) getuid() int  { return 1971 }
 | 
				
			||||||
 | 
					func (k *stubNixOS) getgid() int  { return 100 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (k *stubNixOS) lookupEnv(key string) (string, bool) {
 | 
					func (k *stubNixOS) lookupEnv(key string) (string, bool) {
 | 
				
			||||||
	switch key {
 | 
						switch key {
 | 
				
			||||||
 | 
				
			|||||||
@ -96,11 +96,37 @@ func shimEntrypoint(k syscallDispatcher) {
 | 
				
			|||||||
		k.fatalf("cannot set SUID_DUMP_DISABLE: %v", err)
 | 
							k.fatalf("cannot set SUID_DUMP_DISABLE: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// the Go runtime does not expose siginfo_t so SIGCONT is handled in C to check si_pid
 | 
				
			||||||
 | 
						ppid := k.getppid()
 | 
				
			||||||
 | 
						var signalPipe io.ReadCloser
 | 
				
			||||||
 | 
						if r, wKeepAlive, err := k.setupContSignal(ppid); err != nil {
 | 
				
			||||||
 | 
							switch {
 | 
				
			||||||
 | 
							case errors.As(err, new(*os.SyscallError)): // returned by os.Pipe
 | 
				
			||||||
 | 
								k.fatal(err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case errors.As(err, new(syscall.Errno)): // returned by hakurei_shim_setup_cont_signal
 | 
				
			||||||
 | 
								k.fatalf("cannot install SIGCONT handler: %v", err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							default: // unreachable
 | 
				
			||||||
 | 
								k.fatalf("cannot set up exit request: %v", err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							defer wKeepAlive()
 | 
				
			||||||
 | 
							signalPipe = r
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		state      outcomeState
 | 
							state      outcomeState
 | 
				
			||||||
		closeSetup func() error
 | 
							closeSetup func() error
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	if f, err := k.receive(shimEnv, &state, nil); err != nil {
 | 
						if f, err := k.receive(shimEnv, &state, nil); err != nil {
 | 
				
			||||||
 | 
							if errors.Is(err, io.EOF) {
 | 
				
			||||||
 | 
								// fallback exit request: signal handler not yet installed
 | 
				
			||||||
 | 
								k.exit(hst.ExitRequest)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if errors.Is(err, syscall.EBADF) {
 | 
							if errors.Is(err, syscall.EBADF) {
 | 
				
			||||||
			k.fatal("invalid config descriptor")
 | 
								k.fatal("invalid config descriptor")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -119,25 +145,8 @@ func shimEntrypoint(k syscallDispatcher) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// the Go runtime does not expose siginfo_t so SIGCONT is handled in C to check si_pid
 | 
						if state.Shim.PrivPID != ppid {
 | 
				
			||||||
	var signalPipe io.ReadCloser
 | 
							k.fatalf("unexpectedly reparented from %d to %d", state.Shim.PrivPID, ppid)
 | 
				
			||||||
	if r, wKeepAlive, err := k.setupContSignal(state.Shim.PrivPID); err != nil {
 | 
					 | 
				
			||||||
		switch {
 | 
					 | 
				
			||||||
		case errors.As(err, new(*os.SyscallError)): // returned by os.Pipe
 | 
					 | 
				
			||||||
			k.fatal(err.Error())
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		case errors.As(err, new(syscall.Errno)): // returned by hakurei_shim_setup_cont_signal
 | 
					 | 
				
			||||||
			k.fatalf("cannot install SIGCONT handler: %v", err)
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		default: // unreachable
 | 
					 | 
				
			||||||
			k.fatalf("cannot set up exit request: %v", err)
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		defer wKeepAlive()
 | 
					 | 
				
			||||||
		signalPipe = r
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// pdeath_signal delivery is checked as if the dying process called kill(2), see kernel/exit.c
 | 
						// pdeath_signal delivery is checked as if the dying process called kill(2), see kernel/exit.c
 | 
				
			||||||
 | 
				
			|||||||
@ -142,30 +142,47 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", outcomeState{}, nil}, nil, syscall.EBADF),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", outcomeState{}, nil}, nil, syscall.EBADF),
 | 
				
			||||||
			call("fatal", stub.ExpectArgs{[]any{"invalid config descriptor"}}, nil, nil),
 | 
								call("fatal", stub.ExpectArgs{[]any{"invalid config descriptor"}}, nil, nil),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// deferred
 | 
				
			||||||
 | 
								call("wKeepAlive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
		}}, nil},
 | 
							}}, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		{"receive env", func(k *kstub) error { shimEntrypoint(k); return nil }, stub.Expect{Calls: []stub.Call{
 | 
							{"receive env", func(k *kstub) error { shimEntrypoint(k); return nil }, stub.Expect{Calls: []stub.Call{
 | 
				
			||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", outcomeState{}, nil}, nil, container.ErrReceiveEnv),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", outcomeState{}, nil}, nil, container.ErrReceiveEnv),
 | 
				
			||||||
			call("fatal", stub.ExpectArgs{[]any{"HAKUREI_SHIM not set"}}, nil, nil),
 | 
								call("fatal", stub.ExpectArgs{[]any{"HAKUREI_SHIM not set"}}, nil, nil),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// deferred
 | 
				
			||||||
 | 
								call("wKeepAlive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
		}}, nil},
 | 
							}}, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		{"receive strange", func(k *kstub) error { shimEntrypoint(k); return nil }, stub.Expect{Calls: []stub.Call{
 | 
							{"receive strange", func(k *kstub) error { shimEntrypoint(k); return nil }, stub.Expect{Calls: []stub.Call{
 | 
				
			||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", outcomeState{}, nil}, nil, stub.UniqueError(10)),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", outcomeState{}, nil}, nil, stub.UniqueError(10)),
 | 
				
			||||||
			call("fatalf", stub.ExpectArgs{"cannot receive shim setup params: %v", []any{stub.UniqueError(10)}}, nil, nil),
 | 
								call("fatalf", stub.ExpectArgs{"cannot receive shim setup params: %v", []any{stub.UniqueError(10)}}, nil, nil),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// deferred
 | 
				
			||||||
 | 
								call("wKeepAlive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
		}}, nil},
 | 
							}}, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		{"invalid state", func(k *kstub) error { shimEntrypoint(k); return nil }, stub.Expect{Calls: []stub.Call{
 | 
							{"invalid state", func(k *kstub) error { shimEntrypoint(k); return nil }, stub.Expect{Calls: []stub.Call{
 | 
				
			||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", func() outcomeState {
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", func() outcomeState {
 | 
				
			||||||
				state := templateState
 | 
									state := templateState
 | 
				
			||||||
				state.Shim = newShimParams()
 | 
									state.Shim = newShimParams()
 | 
				
			||||||
@ -174,15 +191,16 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			}(), nil}, nil, nil),
 | 
								}(), nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("fatal", stub.ExpectArgs{[]any{"impossible outcome state reached\n"}}, nil, nil),
 | 
								call("fatal", stub.ExpectArgs{[]any{"impossible outcome state reached\n"}}, nil, nil),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// deferred
 | 
				
			||||||
 | 
								call("wKeepAlive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
		}}, nil},
 | 
							}}, nil},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		{"sigaction pipe", func(k *kstub) error { shimEntrypoint(k); return nil }, stub.Expect{Calls: []stub.Call{
 | 
							{"sigaction pipe", func(k *kstub) error { shimEntrypoint(k); return nil }, stub.Expect{Calls: []stub.Call{
 | 
				
			||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
					 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
					 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, &os.SyscallError{Syscall: "pipe2", Err: stub.UniqueError(9)}),
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, &os.SyscallError{Syscall: "pipe2", Err: stub.UniqueError(9)}),
 | 
				
			||||||
			call("fatal", stub.ExpectArgs{[]any{"pipe2: unique error 9 injected by the test suite"}}, nil, nil),
 | 
								call("fatal", stub.ExpectArgs{[]any{"pipe2: unique error 9 injected by the test suite"}}, nil, nil),
 | 
				
			||||||
		}}, nil},
 | 
							}}, nil},
 | 
				
			||||||
@ -191,9 +209,7 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
					 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
					 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, syscall.ENOTRECOVERABLE),
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, syscall.ENOTRECOVERABLE),
 | 
				
			||||||
			call("fatalf", stub.ExpectArgs{"cannot install SIGCONT handler: %v", []any{syscall.ENOTRECOVERABLE}}, nil, nil),
 | 
								call("fatalf", stub.ExpectArgs{"cannot install SIGCONT handler: %v", []any{syscall.ENOTRECOVERABLE}}, nil, nil),
 | 
				
			||||||
		}}, nil},
 | 
							}}, nil},
 | 
				
			||||||
@ -202,9 +218,7 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
					 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
					 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, stub.UniqueError(8)),
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, stub.UniqueError(8)),
 | 
				
			||||||
			call("fatalf", stub.ExpectArgs{"cannot set up exit request: %v", []any{stub.UniqueError(8)}}, nil, nil),
 | 
								call("fatalf", stub.ExpectArgs{"cannot set up exit request: %v", []any{stub.UniqueError(8)}}, nil, nil),
 | 
				
			||||||
		}}, nil},
 | 
							}}, nil},
 | 
				
			||||||
@ -213,10 +227,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, stub.UniqueError(7)),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, stub.UniqueError(7)),
 | 
				
			||||||
			call("fatalf", stub.ExpectArgs{"cannot set parent-death signal: %v", []any{stub.UniqueError(7)}}, nil, nil),
 | 
								call("fatalf", stub.ExpectArgs{"cannot set parent-death signal: %v", []any{stub.UniqueError(7)}}, nil, nil),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -228,6 +243,8 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", func() outcomeState {
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", func() outcomeState {
 | 
				
			||||||
				state := templateState
 | 
									state := templateState
 | 
				
			||||||
				state.Shim = newShimParams()
 | 
									state.Shim = newShimParams()
 | 
				
			||||||
@ -236,7 +253,6 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			}(), nil}, nil, nil),
 | 
								}(), nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("fatal", stub.ExpectArgs{[]any{"cannot create container state: unique error 6 injected by the test suite\n"}}, nil, nil),
 | 
								call("fatal", stub.ExpectArgs{[]any{"cannot create container state: unique error 6 injected by the test suite\n"}}, nil, nil),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -248,6 +264,8 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", func() outcomeState {
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", func() outcomeState {
 | 
				
			||||||
				state := templateState
 | 
									state := templateState
 | 
				
			||||||
				state.Shim = newShimParams()
 | 
									state.Shim = newShimParams()
 | 
				
			||||||
@ -256,7 +274,6 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			}(), nil}, nil, nil),
 | 
								}(), nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("fatal", stub.ExpectArgs{[]any{"invalid container state"}}, nil, nil),
 | 
								call("fatal", stub.ExpectArgs{[]any{"invalid container state"}}, nil, nil),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -268,10 +285,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
@ -291,10 +309,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
@ -314,10 +333,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
@ -336,10 +356,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
@ -359,10 +380,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, stub.UniqueError(1)),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, stub.UniqueError(1)),
 | 
				
			||||||
@ -385,10 +407,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
@ -411,10 +434,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
@ -436,10 +460,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
@ -462,10 +487,11 @@ func TestShimEntrypoint(t *testing.T) {
 | 
				
			|||||||
			call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
								call("getMsg", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
								call("getLogger", stub.ExpectArgs{}, (*log.Logger)(nil), nil),
 | 
				
			||||||
			call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
								call("setDumpable", stub.ExpectArgs{uintptr(container.SUID_DUMP_DISABLE)}, nil, nil),
 | 
				
			||||||
 | 
								call("getppid", stub.ExpectArgs{}, 0xbad, nil),
 | 
				
			||||||
 | 
								call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
				
			||||||
			call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
								call("receive", stub.ExpectArgs{"HAKUREI_SHIM", templateState, nil}, nil, nil),
 | 
				
			||||||
			call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
								call("swapVerbose", stub.ExpectArgs{true}, false, nil),
 | 
				
			||||||
			call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
								call("verbosef", stub.ExpectArgs{"process share directory at %q, runtime directory at %q", []any{m("/tmp/hakurei.10"), m("/run/user/1000/hakurei")}}, nil, nil),
 | 
				
			||||||
			call("setupContSignal", stub.ExpectArgs{0xbad}, 0, nil),
 | 
					 | 
				
			||||||
			call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
								call("prctl", stub.ExpectArgs{uintptr(syscall.PR_SET_PDEATHSIG), uintptr(syscall.SIGCONT), uintptr(0)}, nil, nil),
 | 
				
			||||||
			call("New", stub.ExpectArgs{}, nil, nil),
 | 
								call("New", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
			call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
								call("closeReceive", stub.ExpectArgs{}, nil, nil),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user