[pulseaudio-discuss] [PATCH v2 00/12] Introduce memfd support
David Henningsson
david.henningsson at canonical.com
Fri Feb 12 10:57:00 UTC 2016
On 2016-02-12 00:59, Ahmed S. Darwish wrote:
> Hello!
Hi and thanks for working on it!
Having skimmed through the patches, I'm still not convinced w r t
auto-send mechanism of the memfds.
E g, consider we have clients 1 and 2, and client 1 plays back audio to
a sink. Client 2 monitors the sink-input of client 1 (like parec does if
you specify --monitor-stream). Could this cause the memfd used to
communicate with client 1 to also be shared with client 2? If so, that's
a security breach.
The mechanism seems fragile to such breaches but I'm not sure, maybe I'm
wrong and you can explain what would happen instead?
>
> The all-improved memfd patch series ;-)
>
> ==> v1 cover letter:
>
> Memfd is a simple memory sharing mechanism, added by the systemd/kdbus
> developers, to share pages between processes in an anonymous, no
> global registry needed, no mount-point required, relatively secure,
> manner.
>
> This patch series introduces memfd support to PulseAudio, laying out
> the necessary (but not yet sufficient) groundwork for sandboxing,
> protecting PulseAudio from its clients, and protecting clients from
> each other.
>
> Memfd support is added in quite a transparent manner, respecting
> current PA mechanisms and abstractions. The lower-level layers are
> properly refactored and extended: the srbchannel communication path
> is transformed to memfds by only changing a single line of code.
>
> ==> v2 changes:
>
> - All pools (srbchannel + client audio data mempool + global mempool)
> now use memfds by default. An empty /dev/shm FTW! ;-)
>
> - Design issues pointed by David now fixed, leading to a much smaller
> code.. New memfd implementation now shares almost all of the
> existing posix SHM code paths.
>
> - Heavy focus on not leaking any file descriptors throughout the
> code. Every fd, sent and received, has a clear owner responsible
> for closing it at appropriate times.
>
> - If a mempool is memfd-backed, we now require registering it with
> the pstream before sending any blocks it covers. This is done to
> to minimize fd passing overhead and the possibility of fd leaks.
>
> - A new, special, pstream packet type is introduced. That special
> packet can be sent anytime during the pstrem's lifetime and is
> used for creating on demand SHM ID to memfd mappings.
>
> - All issues pointed by Tanu's very detailed review (vacuuming,
> memfd enablement over pstream, protocol changes, etc.) now fixed
>
> - Testing! I've been heavily using these patches now for three
> weeks without visible issues.
>
> ==> references:
>
> - v1 submission
> http://thread.gmane.org/gmane.comp.audio.pulseaudio.general/24110
>
> - memfd_create(2), David Herrmann [memfd author]
> https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/
>
> - xdg-app
> https://wiki.gnome.org/Projects/SandboxedApps
>
> ==> diffstat:
>
> Ahmed S. Darwish (12):
> pulsecore: Cache daemon shm size inside pa_core
> pulsecore: srbchannel: Introduce per-client SHM files
> pulsecore: Transform pa_mempool_new() into a factory method
> pulsecore: Split pa_shm mempool backend into pa_shm and pa_privatemem
> pulsecore: SHM: Introduce memfd support
> pulsecore: memexport/memimport: Support memfd blocks
> pulsecore, tests: Use new memexport/memimport API
> pulsecore: Specially mark global mempools
> pulsecore: pstream: Support memfd blocks transport
> srbchannel: Use memfd transport by default; pump protocol version
> pulse: client audio: Use memfd transport by default
> core: Use memfd transport by default
>
> PROTOCOL | 13 ++
> configure.ac | 21 +++-
> man/pulse-client.conf.5.xml.in | 5 +
> man/pulse-daemon.conf.5.xml.in | 5 +
> man/pulseaudio.1.xml.in | 11 ++
> shell-completion/bash/pulseaudio | 4 +-
> shell-completion/zsh/_pulseaudio | 1 +
> src/Makefile.am | 7 ++
> src/daemon/cmdline.c | 13 +-
> src/daemon/daemon-conf.c | 1 +
> src/daemon/daemon-conf.h | 1 +
> src/daemon/main.c | 4 +-
> src/pulse/client-conf.c | 1 +
> src/pulse/client-conf.h | 2 +-
> src/pulse/context.c | 48 +++++++-
> src/pulse/internal.h | 2 +
> src/pulsecore/core.c | 31 +++--
> src/pulsecore/core.h | 13 +-
> src/pulsecore/mem.h | 67 ++++++++++
> src/pulsecore/memblock.c | 245 ++++++++++++++++++++++++++++++++-----
> src/pulsecore/memblock.h | 18 ++-
> src/pulsecore/memfd-wrappers.h | 68 +++++++++++
> src/pulsecore/privatemem.c | 78 ++++++++++++
> src/pulsecore/privatemem.h | 35 ++++++
> src/pulsecore/protocol-native.c | 92 ++++++++++++--
> src/pulsecore/pstream.c | 257 +++++++++++++++++++++++++++++++++++----
> src/pulsecore/pstream.h | 2 +
> src/pulsecore/shm.c | 247 +++++++++++++++++++------------------
> src/pulsecore/shm.h | 33 ++++-
> src/tests/cpu-mix-test.c | 2 +-
> src/tests/lfe-filter-test.c | 2 +-
> src/tests/mcalign-test.c | 2 +-
> src/tests/memblock-test.c | 15 +--
> src/tests/memblockq-test.c | 2 +-
> src/tests/mix-test.c | 2 +-
> src/tests/remix-test.c | 2 +-
> src/tests/resampler-test.c | 2 +-
> src/tests/srbchannel-test.c | 2 +-
> 38 files changed, 1119 insertions(+), 237 deletions(-)
> create mode 100644 src/pulsecore/mem.h
> create mode 100644 src/pulsecore/memfd-wrappers.h
> create mode 100644 src/pulsecore/privatemem.c
> create mode 100644 src/pulsecore/privatemem.h
>
> Regards,
>
> --
> Darwish
> http://darwish.chasingpointers.com
>
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
More information about the pulseaudio-discuss
mailing list