From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ou.quest-ce.net (unknown [IPv6:2001:bc8:3541:100::1]) by sourceware.org (Postfix) with ESMTPS id D8CDC3857C46 for ; Mon, 9 Nov 2020 21:34:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D8CDC3857C46 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=opteya.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=ydroneaud@opteya.com Received: from [2a01:e35:39f2:1220:ab87:b468:44f5:c88a] (helo=thinkpad-t460) by ou.quest-ce.net with esmtpsa (TLS1.1:RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1kcEnx-0006a9-3y; Mon, 09 Nov 2020 22:34:25 +0100 Message-ID: <1874738a1a5f9bddd81783e198def7c5ea11c085.camel@opteya.com> From: Yann Droneaud To: Alexandra =?ISO-8859-1?Q?H=E1jkov=E1?= , libc-alpha@sourceware.org Cc: Alexandra =?ISO-8859-1?Q?H=E1jkov=E1?= Date: Mon, 09 Nov 2020 22:34:18 +0100 In-Reply-To: <20201106210314.399276-1-ahajkova@redhat.com> References: <20200428122019.26826-1-ahajkova@redhat.com> <20201106210314.399276-1-ahajkova@redhat.com> Organization: OPTEYA Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.36.5 (3.36.5-1.fc32) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2a01:e35:39f2:1220:ab87:b468:44f5:c88a X-SA-Exim-Mail-From: ydroneaud@opteya.com X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-Spam-Level: X-Spam-Status: No, score=-13.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Subject: Re: [PATCH] Linux: Add execveat system call wrapper X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:24:06 +0000) X-SA-Exim-Scanned: Yes (on ou.quest-ce.net) X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Nov 2020 21:34:28 -0000 Hi, Le vendredi 06 novembre 2020 à 22:03 +0100, Alexandra Hájková via Libc- alpha a écrit : > diff --git a/posix/tst-execveat.c b/posix/tst-execveat.c > new file mode 100644 > index 0000000000..e2c4164513 > --- /dev/null > +++ b/posix/tst-execveat.c > @@ -0,0 +1,174 @@ > +/* Copyright (C) 2017-2020 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + ;. */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +int > +call_execveat (int fd, const char *pathname, int flags, int expected_fail, > + int num) > +{ > + char *argv[] = { (char *) "sh", (char *) "-c", (char *) "exit 3", NULL }; May be there's no need to run a shell for the test. What about /bin/true or /bin/false ? > + char *envp[] = { (char *) "FOO=BAR", NULL }; > + pid_t pid; > + int status; > + > + test_verbose = 1; > + if (test_verbose > 0) > + printf ("call line number: %d\n", num); > + > + pid = xfork (); > + if (pid == 0) > + { > + > + TEST_COMPARE (execveat (fd, pathname, argv, envp, flags), -1); > + if (errno == ENOSYS) > + FAIL_UNSUPPORTED ("execveat is unimplemented"); > + else if (errno == expected_fail) > + { > + if (test_verbose > 0) > + printf ("expected fail: errno %d\n", errno); > + _exit (0); > + } > + else > + FAIL_EXIT1 ("execveat failed, errno %d", errno); > + } > + xwaitpid (pid, &status, 0); > + > + if (WIFEXITED (status)) > + { > + if (WEXITSTATUS (status) == EXIT_UNSUPPORTED) > + FAIL_UNSUPPORTED ("execveat is unimplemented"); > + else if (expected_fail) > + TEST_COMPARE (WEXITSTATUS (status), 0); > + else > + TEST_COMPARE (WEXITSTATUS (status), 3); > + } > + return 0; > +} > + > +static int > +do_test (void) > +{ > + DIR *dirp; > + int fd, fd_out; > + char *tmp_dir, *symlink_name, *tmp_sh; > + struct stat st; > + > + dirp = opendir ("/bin"); > + if (dirp == NULL) > + FAIL_EXIT1 ("failed to open /bin"); > + fd = dirfd (dirp); > + > + /* Call execveat for various fd/pathname combinations */ > + > + /* fd: valid dir, pathname: relative, flags:: 0 */ > + call_execveat (fd, "sh", 0, 0, __LINE__); > + /* fd: AT_FDCWD, pathname: relative, flags: 0 > + If pathname is relative and dirfd is the special value AT_FDCWD, then > + pathname is interpreted relative to the current working directory of > + the calling process */ > + chdir ("/bin"); > + call_execveat (AT_FDCWD, "sh", 0, 0, __LINE__); > + xclose (fd); > +#ifdef O_PATH > + /* fd: valid dir with O_PATH, pathname: relative, flags: 0 */ > + fd = xopen ("/bin", O_PATH | O_DIRECTORY, O_RDONLY); > + call_execveat (fd, "sh", 0, 0, __LINE__); > + xclose (fd); > + > + fd = xopen ("/usr", O_PATH | O_DIRECTORY, 0); > + /* fd: AT_FDCWD, pathname: absolute in different dir, flags: 0 */ > + call_execveat (AT_FDCWD, "/bin/sh", 0, 0, __LINE__); > + /* fd: valid dir with O_PATH, pathname: absolute, flags: 0 */ > + call_execveat (fd, "/bin/sh", 0, 0, __LINE__); > + xclose (fd); > +#endif > + > + fd = xopen ("/usr", O_RDONLY, 0); > + /* fd: valid dir, pathname: absolute in differen dir, flags: 0 */ > + call_execveat (fd, "/bin/sh", 0, 0, __LINE__); > + xclose (fd); > + > + fd = xopen ("/bin/sh", O_RDONLY, 0); > + /* fd: regular file, pathname: relative, flags: 0 */ > + call_execveat (fd, "sh", 0, ENOTDIR, __LINE__); > + /* fd: regular file, pathname: absolute, flags: 0 */ > + call_execveat (fd, "/bin/sh", 0, 0, __LINE__); > + xclose (fd); > + > +#ifdef O_PATH > + fd = xopen ("/bin/sh", O_PATH, 0); > + /* fd: O_PATH of regular file, pathname: empty, flags: 0 */ > + call_execveat (fd, "", 0, ENOENT, __LINE__); > + /* fd: O_PATH of regular file, pathname: empty, flags: AT_EMPTY_PATH */ > + call_execveat (fd, "", AT_EMPTY_PATH, 0, __LINE__); > + /* fd: O_PATH of regular file, pathname: empty, > + flags: AT_EMPTY_PATH AT_SYMLINK_NOFOLLOW */ > + call_execveat (fd, "", AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW, 0, __LINE__); > + xclose (fd); > + > + tmp_dir = support_create_temp_directory ("tst-execveat_dir"); > + symlink_name = xasprintf ("%s/symlink", tmp_dir); > + xsymlink ("tmp_sh", symlink_name); > + add_temp_file (symlink_name); > + tmp_sh = xasprintf ("%s/tmp_sh", tmp_dir); > + add_temp_file (tmp_sh); > + fd_out = xopen (symlink_name, O_CREAT | O_WRONLY, 0); > + stat ("/bin/sh", &st); > + fd = xopen ("/bin/sh", O_RDONLY, 0); > + xcopy_file_range (fd, 0, fd_out, 0, st.st_size, 0); > + fchmod (fd_out, 0777); > + xclose (fd); > + xclose (fd_out); > + fd_out = xopen (symlink_name, O_PATH, 0); > + > + /* fd: O_PATH of symbolic link, pathname: empty, flags: 0 */ > + call_execveat (fd_out, "", 0, ENOENT, __LINE__); > + /* fd: O_PATH of symbolic link, pathname: empty, flags: AT_EMPTY_PATH */ > + call_execveat (fd_out, "", AT_EMPTY_PATH, 0, __LINE__); > + /* fd: O_PATH of symbolic link, pathname: empty, > + flags: AT_EMPTY_PATH AT_SYMLINK_NOFOLLOW */ > + call_execveat (fd_out, "", AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW, 0, > + __LINE__); > + xclose (fd_out); > + free (symlink_name); > + free (tmp_sh); > + free (tmp_dir); > +#endif > + > + /* Call execveat with closed fd, we expect this to fail with EBADF */ > + call_execveat (fd, "sh", 0, EBADF, __LINE__); > + /* Call execveat with closed fd, we expect this to pass because the pathname is > + absolute */ > + call_execveat (fd, "/bin/sh", 0, 0, __LINE__); > + > + return 0; > +} > + > +#include Regards -- Yann Droneaud OPTEYA