88 lines
2.4 KiB
Go
88 lines
2.4 KiB
Go
// Copyright (c) 2026 Storm Dragon
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package control
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
"testing"
|
|
)
|
|
|
|
func socket_pair(t *testing.T, path string) (*net.UnixConn, *net.UnixConn) {
|
|
t.Helper()
|
|
listener, err := net.ListenUnix("unix", &net.UnixAddr{Name: path, Net: "unix"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { listener.Close() })
|
|
client := connect_remote(t, path)
|
|
server, err := listener.AcceptUnix()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { server.Close() })
|
|
return client, server
|
|
}
|
|
|
|
func TestHandoffReadsOriginalCallerBytesAndRejectsInvalidDescriptors(t *testing.T) {
|
|
options := private_options(t)
|
|
caller, original := socket_pair(t, filepath.Join(options.Directory, "caller.sock"))
|
|
if _, err := io.WriteString(caller, "COMMAND SAY original\n"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
file, err := original.File()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer file.Close()
|
|
ordinary, err := os.CreateTemp(options.Directory, "ordinary-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer ordinary.Close()
|
|
for _, trial := range []struct {
|
|
name, header string
|
|
fds []int
|
|
valid bool
|
|
}{
|
|
{"original", handoffMarker + "COMMAND SAY substituted\n", []int{int(file.Fd())}, true},
|
|
{"file", handoffMarker, []int{int(ordinary.Fd())}, false},
|
|
{"multiple", handoffMarker, []int{int(file.Fd()), int(file.Fd())}, false},
|
|
{"header", "INVALID\n", []int{int(file.Fd())}, false},
|
|
} {
|
|
t.Run(trial.name, func(t *testing.T) {
|
|
sender, receiver := socket_pair(t, filepath.Join(options.Directory, trial.name+".sock"))
|
|
if _, _, err := sender.WriteMsgUnix([]byte(trial.header), syscall.UnixRights(trial.fds...), nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
_ = sender.CloseWrite()
|
|
_, forwarded, err := receive_request(receiver)
|
|
if !trial.valid {
|
|
if forwarded != nil {
|
|
forwarded.Close()
|
|
}
|
|
if err == nil {
|
|
t.Fatal("accepted malformed handoff")
|
|
}
|
|
return
|
|
}
|
|
if err != nil || forwarded == nil {
|
|
t.Fatal("valid handoff rejected", err)
|
|
}
|
|
defer forwarded.Close()
|
|
pid, uid, err := peer(forwarded)
|
|
if err != nil || pid != os.Getpid() || uid != os.Geteuid() {
|
|
t.Fatal("caller credentials changed", pid, uid, err)
|
|
}
|
|
text, err := read_request(forwarded, nil)
|
|
if err != nil || text != "COMMAND SAY original" {
|
|
t.Fatal("handoff substituted caller bytes", text, err)
|
|
}
|
|
})
|
|
}
|
|
}
|