From: Dmitry V. Levin Date: Sat, 13 Aug 2016 22:05:28 +0000 (+0000) Subject: tests: check for leaks of placeholder descriptors X-Git-Tag: v4.14~199 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7c6e8f1490f6f964fa40e62ff374431136ef215b;p=strace tests: check for leaks of placeholder descriptors * tests/redirect-fds.c: New file. * tests/redirect-fds.test: New test. * tests/.gitignore: Add redirect-fds. * tests/Makefile.am (check_PROGRAMS): Likewise. (MISC_TESTS): Add redirect-fds.test. --- diff --git a/tests/.gitignore b/tests/.gitignore index 387f12c4..8a596c6d 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -192,6 +192,7 @@ reboot recvfrom recvmmsg-timeout recvmsg +redirect-fds remap_file_pages rename renameat diff --git a/tests/Makefile.am b/tests/Makefile.am index 6cc1d2bc..0c28f06b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -248,6 +248,7 @@ check_PROGRAMS = \ recvfrom \ recvmmsg-timeout \ recvmsg \ + redirect-fds \ remap_file_pages \ rename \ renameat \ @@ -700,6 +701,7 @@ MISC_TESTS = \ pc.test \ qual_syscall.test \ redirect.test \ + redirect-fds.test \ restart_syscall.test \ signal_receive.test \ strace-E.test \ diff --git a/tests/redirect-fds.c b/tests/redirect-fds.c new file mode 100644 index 00000000..fc1073a7 --- /dev/null +++ b/tests/redirect-fds.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "tests.h" +#include +#include +#include + +#define N_FDS 3 + +/* + * Do not print any messages, indicate errors with return codes. + */ +static int +check_fd(int fd, const char *fname) +{ + const int should_be_closed = (fname[0] == '\0'); + + struct stat st_fd, st_fn; + + if (fstat(fd, &st_fd)) { + if (!should_be_closed) + return 10 + fd; + } else { + if (should_be_closed) + return 20 + fd; + + if (stat(fname, &st_fn)) + return 30 + fd; + + if (st_fd.st_dev != st_fn.st_dev + || st_fd.st_ino != st_fn.st_ino) + return 40 + fd; + } + + return 0; +} + +int +main(int ac, char **av) +{ + assert(ac == 1 + N_FDS); + + int rc = 0, fd; + for (fd = 1; fd < 1 + N_FDS; ++fd) + if ((rc = check_fd(fd - 1, av[fd]))) + break; + + return rc; +} diff --git a/tests/redirect-fds.test b/tests/redirect-fds.test new file mode 100755 index 00000000..a451917b --- /dev/null +++ b/tests/redirect-fds.test @@ -0,0 +1,66 @@ +#!/bin/sh +# +# Check that strace does not leak placeholder descriptors. +# +# Copyright (c) 2016 Dmitry V. Levin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +. "${srcdir=.}/init.sh" + +fd0="$LOG.fd0" +fd1="$LOG.fd1" +fd2="$LOG.fd2" + +check_prog touch + +check_fd() +{ + local a1 a2 a3 + a1="$1" + a2="$2" + a3="$3" + + touch "$LOG" "$fd0" || + framework_skip_ 'failed to create files' + + set -- "\"./$NAME\"" "\"$1\"" "\"$2\"" "\"$3\"" + eval "$@" "<${a1:-&-}" ">${a2:-&-}" "2>${a3:-&-}" || + fail_ "$* failed with code $rc" + + set -- "$STRACE" -o"$LOG" -echdir "$@" + eval "$@" "<${a1:-&-}" ">${a2:-&-}" "2>${a3:-&-}" || + dump_log_and_fail_with "$* failed with code $?" + + rm -f "$LOG" "$fd0" "$fd1" "$fd2" +} + +check_fd "$fd0" "$fd1" "$fd2" +check_fd '' "$fd1" "$fd2" +check_fd "$fd0" '' "$fd2" +check_fd "$fd0" "$fd1" '' +check_fd '' '' "$fd2" +check_fd '' "$fd1" '' +check_fd "$fd0" '' '' +check_fd '' '' ''