From 2783aa9fc93a7f6144470111e3ade3e9d437b57a Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 20 Nov 2011 10:52:21 +0000 Subject: [PATCH] tests: add t/180-fd-leaks to ensure i3 does not leak fds on exec --- testcases/t/180-fd-leaks.t | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 testcases/t/180-fd-leaks.t diff --git a/testcases/t/180-fd-leaks.t b/testcases/t/180-fd-leaks.t new file mode 100644 index 00000000..487803c4 --- /dev/null +++ b/testcases/t/180-fd-leaks.t @@ -0,0 +1,49 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Verifies that i3 does not leak any file descriptors in 'exec'. +# +use i3test; +use POSIX qw(mkfifo); +use File::Temp qw(:POSIX tempfile); + +my $i3 = i3(get_socket_path()); + +my $tmp = tmpnam(); +mkfifo($tmp, 0600) or die "Could not create FIFO in $tmp"; +my ($outfh, $outname) = tempfile('/tmp/i3-ls-output.XXXXXX', UNLINK => 1); + +cmd qq|exec ls -l /proc/self/fd >$outname && echo done >$tmp|; + +open(my $fh, '<', $tmp); +# Block on the FIFO, this will return exactly when the command is done. +<$fh>; +close($fh); +unlink($tmp); + +# Get the ls /proc/self/fd output +my $output; +{ + local $/; + $output = <$outfh>; +} +close($outfh); + +# Split lines, keep only those which are symlinks. +my @lines = grep { /->/ } split("\n", $output); + +my %fds = map { /([0-9]+) -> (.+)$/; ($1, $2) } @lines; + +# Filter out 0, 1, 2 (stdin, stdout, stderr). +delete $fds{0}; +delete $fds{1}; +delete $fds{2}; + +# Filter out the fd which is caused by ls calling readdir(). +for my $fd (keys %fds) { + delete $fds{$fd} if $fds{$fd} =~ m,^/proc/\d+/fd$,; +} + +is(scalar keys %fds, 0, 'No file descriptors leaked'); + +done_testing;