From c13ca15f1a9efad6c85e2debf5bcc54db425d017 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sat, 14 Nov 2009 08:17:44 -0700 Subject: openat: detect Solaris fchownat bug Solaris 9 fchownat(dir,"name/",uid,gid,flag) has same bugs as chown and lchown. * lib/fchownat.c (rpl_fchownat): Work around Solaris bug. Avoid penalizing glibc chownat when only lchownat is broken. * m4/openat.m4 (gl_FUNC_FCHOWNAT): Replace fchownat if there are trailing slash bugs. * doc/posix-functions/fchownat.texi (fchownat): Document the bug. * modules/openat-tests (Files): Include more files. (Depends-on): Add mgetgroups, sleep, stat-time. (configure.ac): Add additional checks. (Makefile.am): Build new test. * tests/test-fchownat.c: New file. Signed-off-by: Eric Blake --- tests/test-fchownat.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 tests/test-fchownat.c (limited to 'tests/test-fchownat.c') diff --git a/tests/test-fchownat.c b/tests/test-fchownat.c new file mode 100644 index 0000000000..2dbc857ec4 --- /dev/null +++ b/tests/test-fchownat.c @@ -0,0 +1,89 @@ +/* Tests of fchownat. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake , 2009. */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "mgetgroups.h" +#include "openat.h" +#include "stat-time.h" + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + +#define BASE "test-fchownat.t" + +#include "test-chown.h" +#include "test-lchown.h" + +static int dfd = AT_FDCWD; + +/* Wrapper around fchownat to test chown behavior. */ +static int +do_chown (char const *name, uid_t user, gid_t group) +{ + return chownat (dfd, name, user, group); +} + +/* Wrapper around fchownat to test lchown behavior. */ +static int +do_lchown (char const *name, uid_t user, gid_t group) +{ + return lchownat (dfd, name, user, group); +} + +int +main (void) +{ + int result1; /* Skip because of no chown/symlink support. */ + int result2; /* Skip because of no lchown support. */ + + /* Clean up any trash from prior testsuite runs. */ + ASSERT (system ("rm -rf " BASE "*") == 0); + + /* Basic tests. */ + result1 = test_chown (do_chown, true); + result2 = test_lchown (do_lchown, result1 == 0); + dfd = open (".", O_RDONLY); + ASSERT (0 <= dfd); + ASSERT (test_chown (do_chown, false) == result1); + ASSERT (test_lchown (do_lchown, false) == result2); + /* We expect 0/0, 0/77, or 77/77, but not 77/0. */ + ASSERT (result1 <= result2); + ASSERT (close (dfd) == 0); + + /* FIXME - add additional tests of dfd not at current directory. */ + return result1 | result2; +} -- cgit v1.2.1