aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-10-18 01:01:52 +0900
committerOphestra <cat@gensokyo.uk>2025-10-18 01:01:52 +0900
commitb066495a7d59a0e0fc2c0935634634edff3ab286 (patch)
tree2e0b95efba50499d705f3665869547b694a65da6 /internal
parent82299d34c60928e4908c784e771c0fc4aa283a5b (diff)
internal/app/sppulse: check buf error injection
The loadFile behaviour does not guarantee the buffer to be zeroed or not clobbered if an error is returned, but for the current implementation it is good to check. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal')
-rw-r--r--internal/app/sppulse_test.go99
1 files changed, 41 insertions, 58 deletions
diff --git a/internal/app/sppulse_test.go b/internal/app/sppulse_test.go
index 7c050bf5..6940f227 100644
--- a/internal/app/sppulse_test.go
+++ b/internal/app/sppulse_test.go
@@ -244,6 +244,40 @@ func TestSpPulseOp(t *testing.T) {
func TestLoadFile(t *testing.T) {
t.Parallel()
+ fAfterWriteExact := func(k *kstub) error {
+ buf := make([]byte, 1<<8)
+ n, err := loadFile(k, k,
+ "simulated PulseAudio cookie",
+ "/home/ophestra/xdg/config/pulse/cookie",
+ buf)
+ k.Verbose(buf[:n])
+ return err
+ }
+
+ fAfterWrite := func(k *kstub) error {
+ buf := make([]byte, 1<<8+0xfd)
+ n, err := loadFile(k, k,
+ "simulated PulseAudio cookie",
+ "/home/ophestra/xdg/config/pulse/cookie",
+ buf)
+ k.Verbose(buf[:n])
+ return err
+ }
+
+ fBeforeWrite := func(k *kstub) error {
+ buf := make([]byte, 1<<8+0xfd)
+ n, err := loadFile(k, k,
+ "simulated PulseAudio cookie",
+ "/home/ophestra/xdg/config/pulse/cookie",
+ buf)
+ k.Verbose(n)
+
+ if !bytes.Equal(buf, make([]byte, len(buf))) {
+ t.Errorf("loadFile: buf = %#v", buf)
+ }
+ return err
+ }
+
sampleCookie := bytes.Repeat([]byte{0xfc}, pulseCookieSizeMax)
checkSimple(t, "loadFile", []simpleTestCase{
{"buf", func(k *kstub) error {
@@ -257,14 +291,7 @@ func TestLoadFile(t *testing.T) {
call("verbose", stub.ExpectArgs{[]any{-1}}, nil, nil),
}}, errors.New("invalid buffer")},
- {"stat", func(k *kstub) error {
- n, err := loadFile(k, k,
- "simulated PulseAudio cookie",
- "/home/ophestra/xdg/config/pulse/cookie",
- make([]byte, 1<<8+0xfd))
- k.Verbose(n)
- return err
- }, stub.Expect{Calls: []stub.Call{
+ {"stat", fBeforeWrite, stub.Expect{Calls: []stub.Call{
call("stat", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, (*stubFi)(nil), stub.UniqueError(3)),
call("verbose", stub.ExpectArgs{[]any{-1}}, nil, nil),
}}, &hst.AppError{
@@ -272,14 +299,7 @@ func TestLoadFile(t *testing.T) {
Err: stub.UniqueError(3),
}},
- {"dir", func(k *kstub) error {
- n, err := loadFile(k, k,
- "simulated PulseAudio cookie",
- "/home/ophestra/xdg/config/pulse/cookie",
- make([]byte, 1<<8+0xfd))
- k.Verbose(n)
- return err
- }, stub.Expect{Calls: []stub.Call{
+ {"dir", fBeforeWrite, stub.Expect{Calls: []stub.Call{
call("stat", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubFi{isDir: true}, nil),
call("verbose", stub.ExpectArgs{[]any{-1}}, nil, nil),
}}, &hst.AppError{
@@ -287,14 +307,7 @@ func TestLoadFile(t *testing.T) {
Err: &os.PathError{Op: "stat", Path: "/home/ophestra/xdg/config/pulse/cookie", Err: syscall.EISDIR},
}},
- {"oob", func(k *kstub) error {
- n, err := loadFile(k, k,
- "simulated PulseAudio cookie",
- "/home/ophestra/xdg/config/pulse/cookie",
- make([]byte, 1<<8+0xfd))
- k.Verbose(n)
- return err
- }, stub.Expect{Calls: []stub.Call{
+ {"oob", fBeforeWrite, stub.Expect{Calls: []stub.Call{
call("stat", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubFi{size: 1<<8 + 0xff}, nil),
call("verbose", stub.ExpectArgs{[]any{-1}}, nil, nil),
}}, &hst.AppError{
@@ -303,58 +316,28 @@ func TestLoadFile(t *testing.T) {
Msg: `simulated PulseAudio cookie at "/home/ophestra/xdg/config/pulse/cookie" exceeds expected size`,
}},
- {"open", func(k *kstub) error {
- n, err := loadFile(k, k,
- "simulated PulseAudio cookie",
- "/home/ophestra/xdg/config/pulse/cookie",
- make([]byte, 1<<8+0xfd))
- k.Verbose(n)
- return err
- }, stub.Expect{Calls: []stub.Call{
+ {"open", fBeforeWrite, stub.Expect{Calls: []stub.Call{
call("stat", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubFi{size: 1 << 8}, nil),
call("verbosef", stub.ExpectArgs{"%s at %q is %d bytes shorter than expected", []any{"simulated PulseAudio cookie", "/home/ophestra/xdg/config/pulse/cookie", int64(0xfd)}}, nil, nil),
call("open", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, (*stubOsFile)(nil), stub.UniqueError(2)),
call("verbose", stub.ExpectArgs{[]any{-1}}, nil, nil),
}}, &hst.AppError{Step: "open simulated PulseAudio cookie", Err: stub.UniqueError(2)}},
- {"read", func(k *kstub) error {
- n, err := loadFile(k, k,
- "simulated PulseAudio cookie",
- "/home/ophestra/xdg/config/pulse/cookie",
- make([]byte, 1<<8+0xfd))
- k.Verbose(n)
- return err
- }, stub.Expect{Calls: []stub.Call{
+ {"read", fBeforeWrite, stub.Expect{Calls: []stub.Call{
call("stat", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubFi{size: 1 << 8}, nil),
call("verbosef", stub.ExpectArgs{"%s at %q is %d bytes shorter than expected", []any{"simulated PulseAudio cookie", "/home/ophestra/xdg/config/pulse/cookie", int64(0xfd)}}, nil, nil),
call("open", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubOsFile{Reader: errorReader{stub.UniqueError(1)}}, nil),
call("verbose", stub.ExpectArgs{[]any{-1}}, nil, nil),
}}, &hst.AppError{Step: "read simulated PulseAudio cookie", Err: stub.UniqueError(1)}},
- {"short close", func(k *kstub) error {
- buf := make([]byte, 1<<8+0xfd)
- n, err := loadFile(k, k,
- "simulated PulseAudio cookie",
- "/home/ophestra/xdg/config/pulse/cookie",
- buf)
- k.Verbose(buf[:n])
- return err
- }, stub.Expect{Calls: []stub.Call{
+ {"short close", fAfterWrite, stub.Expect{Calls: []stub.Call{
call("stat", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubFi{size: 1 << 8}, nil),
call("verbosef", stub.ExpectArgs{"%s at %q is %d bytes shorter than expected", []any{"simulated PulseAudio cookie", "/home/ophestra/xdg/config/pulse/cookie", int64(0xfd)}}, nil, nil),
call("open", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubOsFile{closeErr: stub.UniqueError(0), Reader: bytes.NewReader(sampleCookie)}, nil),
call("verbose", stub.ExpectArgs{[]any{sampleCookie}}, nil, nil),
}}, &hst.AppError{Step: "close simulated PulseAudio cookie", Err: stub.UniqueError(0)}},
- {"success", func(k *kstub) error {
- buf := make([]byte, 1<<8)
- n, err := loadFile(k, k,
- "simulated PulseAudio cookie",
- "/home/ophestra/xdg/config/pulse/cookie",
- buf)
- k.Verbose(buf[:n])
- return err
- }, stub.Expect{Calls: []stub.Call{
+ {"success", fAfterWriteExact, stub.Expect{Calls: []stub.Call{
call("stat", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubFi{size: 1 << 8}, nil),
call("verbosef", stub.ExpectArgs{"loading %d bytes from %q", []any{1 << 8, "/home/ophestra/xdg/config/pulse/cookie"}}, nil, nil),
call("open", stub.ExpectArgs{"/home/ophestra/xdg/config/pulse/cookie"}, &stubOsFile{Reader: bytes.NewReader(sampleCookie)}, nil),