aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-12-14 09:41:28 +0900
committerOphestra <cat@gensokyo.uk>2025-12-14 09:41:28 +0900
commit178c8bc28bc7ff5efc63415796c0c79e649b3cd7 (patch)
tree40c114cadc0f4d77ecd607ca9e7d03880f02a419 /internal
parent30dcab07340610bfd6d015e10022b9ca2a27bb51 (diff)
internal/pipewire: handle SecurityContext::Create error
This method can result in an error targeting it, so it is handled here. This change also causes a call to Create to also Core::Sync, as it should have done. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal')
-rw-r--r--internal/pipewire/pipewire_test.go3
-rw-r--r--internal/pipewire/securitycontext.go32
-rw-r--r--internal/system/pipewire.go3
3 files changed, 27 insertions, 11 deletions
diff --git a/internal/pipewire/pipewire_test.go b/internal/pipewire/pipewire_test.go
index 1ba72857..0b65b86b 100644
--- a/internal/pipewire/pipewire_test.go
+++ b/internal/pipewire/pipewire_test.go
@@ -680,9 +680,6 @@ func TestContext(t *testing.T) {
}); err != nil {
t.Fatalf("SecurityContext.Create: error = %v", err)
}
- if err := ctx.GetCore().Sync(); err != nil {
- t.Fatalf("Sync: error = %v", err)
- }
// none of these should change
if coreInfo := ctx.GetCore().Info; !reflect.DeepEqual(coreInfo, &wantCoreInfo0) {
diff --git a/internal/pipewire/securitycontext.go b/internal/pipewire/securitycontext.go
index 21123f19..ec19a64a 100644
--- a/internal/pipewire/securitycontext.go
+++ b/internal/pipewire/securitycontext.go
@@ -111,17 +111,39 @@ func (registry *Registry) GetSecurityContext() (securityContext *SecurityContext
}
// Create queues a [SecurityContextCreate] message for the PipeWire server.
-func (securityContext *SecurityContext) Create(listenFd, closeFd int, props SPADict) error {
- if err := securityContext.checkDestroy(); err != nil {
- return err
+func (securityContext *SecurityContext) Create(listenFd, closeFd int, props SPADict) (err error) {
+ if err = securityContext.checkDestroy(); err != nil {
+ return
+ }
+
+ asCoreError := securityContext.ctx.expectsCoreError(securityContext.ID, &err)
+ if err != nil {
+ return
}
// queued in reverse based on upstream behaviour, unsure why
offset := securityContext.ctx.queueFiles(closeFd, listenFd)
- return securityContext.ctx.writeMessage(
+ if err = securityContext.ctx.writeMessage(
securityContext.ID,
&SecurityContextCreate{ListenFd: offset + 1, CloseFd: offset + 0, Properties: &props},
- )
+ ); err != nil {
+ return
+ }
+ if err = securityContext.ctx.GetCore().Sync(); err == nil {
+ return nil
+ }
+
+ if coreError := asCoreError(); coreError == nil {
+ return
+ } else {
+ switch syscall.Errno(-coreError.Result) {
+ case syscall.EPERM:
+ return &PermissionError{securityContext.ID, coreError.Message}
+
+ default:
+ return coreError
+ }
+ }
}
// securityContextCloser holds onto resources associated to the security context.
diff --git a/internal/system/pipewire.go b/internal/system/pipewire.go
index d04cae41..2026b2b4 100644
--- a/internal/system/pipewire.go
+++ b/internal/system/pipewire.go
@@ -63,9 +63,6 @@ func (p *pipewireOp) apply(sys *I) (err error) {
{Key: pipewire.PW_KEY_ACCESS, Value: "restricted"},
}); err != nil {
return newOpError("pipewire", err, false)
- } else if err = ctx.GetCore().Sync(); err != nil {
- _ = p.scc.Close()
- return newOpError("pipewire", err, false)
}
if err = sys.chmod(p.dst.String(), 0); err != nil {