[PATCH DEBUG] pulse: Enable memfd for client palyback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 17 January 2016 at 02:05, Ahmed S. Darwish <darwish.07 at gmail.com> wrote:
> On Mon, Sep 21, 2015 at 03:20:01AM +0200, Ahmed S. Darwish wrote:
>> Hi,
>>
>> This is a debugging patch I'm sending to ask for help for a bug
>> I'm currently facing when enabling memfd for client playback audio.
>>
>> In this patch, I simply transform the client playback mempool
>> (context->mempool) to be backed by memfd shared memory instead of
>> posix SHM one.
>>
> [...]
>> when doing so for the playback mempool, sometimes pstreams code
>> reach do_read() with a flag PA_FLAG_MEMFD_FD (implying that this is
>> indeed a marshalled memfd-block frame), but with a reset ancillary
>> data field (nfd = 0) and no memfd descriptors
>>
>
> woooooooooot, bug cause discovered.
>
> This was an fd leak that, in interaction with UNIX sockets fd passing,
> manifested itself in a very weird manner!
>
> ## Situation:
>
> - Over time, PA daemon reaches its open fd limit (due to fd leak)
> - a client sends a memfd fd, as ancil data, over the socket
>
> ## Expected result:
>
> - Kernel fails at the recvmsg() system call, complaining with
>   something like -EMFILE
>
> ## What actually happens:
>
> - Kernel won't complain at all, or even return any kind of error. It
>   will just _silently_ strip the file descriptor from the passed ancil
>   message.
>
> - Naturally, this leads to broken expectations from the pstream side.
>   (pstream code expecting a passed file descriptor but finds nothing)
>
> - /me wondering how the passed fd could silently vanish in this manner
>   (originally blamed on a misunderstanding of pstreams behavior)
>
> Anyway, this was a blocker for this patch series that is now fixed :)

Yeeesh, nice catch. :-)

-- Arun


[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux