Files

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)
}
})
}
}