[PATCH wayland 0/9] Stop leaking file descriptors

Derek Foreman derekf at osg.samsung.com
Fri Apr 7 20:27:46 UTC 2017

Turns out there are several different ways to leak file descriptors in
libwayland, this is an attempt to show a couple of those via tests, and
close them off.

patch 1 is, I think, a bug fix for a long standing error where close_fds
only works sensible when told to close all the available fds.  If it
closed less than all of them, it just leaked the rest.  This seems to be
unusable behaviour, so I've made it handle subsets of available fds in
preparation for a later patch that uses that.  Until now, it's only been
used for all fds, so this bug has been purely theoretical.

2-3 introduce two new test cases for catching fd leaks on zombie objects

4,5,6 close the low hanging fruit fd leaks - failure during marshal,
demarshal, or when a closure has been demarshalled successfully
but a previous event in the same buffer has turned its target into
a zombie.

7 is almost entirely gratuitous, at the time I thought it made the
following patches a tiny bit easier to review.

8 is the most controversial in the series because it removes the
singleton zombie object we've had until now and replaces it with a
client-side only map flag denoting zombieness - and stores the
*interface* in the proxy's old map slot so we have it around if we
need its signatures to properly eat events sent to the zombie that
contain fds.  It's a little gross, but I've not been able to think
of anything much prettier.

9 fixes the long standing bug where an event with an fd is sent to
a zombie object, but not immediately (so it's not demarshalled
before the object becomes a zombie), and the same buffer contains an
event with an fd for an object that's still valid.  Since we weren't
properly removing zombie object fds from the buffer, the valid object
would get the zombie's fd, and the valid fd would get leaked.


Derek Foreman (9):
  connection: close_fds() should only remove fds it closed from the
  tests: Add a test for fd leaks on zombie objects
  tests: Check for wrong fd delivery with zombie objects
  connection: Close fds from half marshalled closures
  connection: Close fds from half demarshalled closures
  connection: Make wl_closure_destroy() close fds of undispatched
  client: Simplify some logic in queue_event
  client: Replace the singleton zombie with bespoke zombies
  client: Consume file descriptors destined for zombie proxies

 Makefile.am              |   7 +-
 protocol/tests.xml       |  52 +++++++++++
 src/connection.c         |  71 +++++++++++++-
 src/wayland-client.c     |  51 +++++++---
 src/wayland-private.h    |  17 +++-
 src/wayland-server.c     |   6 +-
 src/wayland-util.c       |  22 ++++-
 tests/connection-test.c  |  12 +--
 tests/display-test.c     | 239 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/os-wrappers-test.c |   4 +-
 10 files changed, 445 insertions(+), 36 deletions(-)
 create mode 100644 protocol/tests.xml


More information about the wayland-devel mailing list