* posix/execvp.c (execvp): Use file name including path when

trying to run it with shell.
	* posix/Makefile: Add rules to build and run tst-execvp3.
	* posix/tst-execvp3.c: New file.
This commit is contained in:
Ulrich Drepper 2005-04-14 21:20:51 +00:00
parent 806bc96abb
commit 506cbf1f43
4 changed files with 54 additions and 3 deletions

View file

@ -1,3 +1,10 @@
2005-04-14 Ulrich Drepper <drepper@redhat.com>
* posix/execvp.c (execvp): Use file name including path when
trying to run it with shell.
* posix/Makefile: Add rules to build and run tst-execvp3.
* posix/tst-execvp3.c: New file.
2005-04-12 Ulrich Drepper <drepper@redhat.com>
* stdlib/random_r.c (__initstate_r): Don't use non-existing state.

View file

@ -86,7 +86,8 @@ tests := tstgetopt testfnm runtests runptests \
tst-getaddrinfo2 bug-glob1 bug-glob2 tst-sysconf \
tst-execvp1 tst-execvp2 tst-execlp1 tst-execlp2 \
tst-execv1 tst-execv2 tst-execl1 tst-execl2 \
tst-execve1 tst-execve2 tst-execle1 tst-execle2
tst-execve1 tst-execve2 tst-execle1 tst-execle2 \
tst-execvp3
xtests := bug-ga2
ifeq (yes,$(build-shared))
test-srcs := globtest
@ -190,6 +191,7 @@ tst-rxspencer-ENV = LOCPATH=$(common-objpfx)localedata
tst-pcre-ARGS = PCRE.tests
tst-boost-ARGS = BOOST.tests
bug-glob1-ARGS = "$(objpfx)"
tst-execvp3-ARGS = --test-dir=$(objpfx)
testcases.h: TESTS TESTS2C.sed
sed -f TESTS2C.sed < $< > $@T

View file

@ -133,14 +133,14 @@ execvp (file, argv)
else
startp = (char *) memcpy (name - (p - path), path, p - path);
/* Try to execute this name. If it works, execv will not return. */
/* Try to execute this name. If it works, execve will not return. */
__execve (startp, argv, __environ);
if (errno == ENOEXEC)
{
if (script_argv == NULL)
{
script_argv = allocate_scripts_argv (file, argv);
script_argv = allocate_scripts_argv (startp, argv);
if (script_argv == NULL)
{
/* A possible EACCES error is not as important as

42
posix/tst-execvp3.c Normal file
View file

@ -0,0 +1,42 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
static void do_prepare (void);
#define PREPARE(argc, argv) do_prepare ()
static int do_test (void);
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
static char *fname;
static void
do_prepare (void)
{
int fd = create_temp_file ("testscript", &fname);
dprintf (fd, "echo foo\n");
fchmod (fd, 0700);
close (fd);
}
static int
do_test (void)
{
if (setenv ("PATH", test_dir, 1) != 0)
{
puts ("setenv failed");
return 1;
}
char *argv[] = { fname, NULL };
execvp (basename (fname), argv);
/* If we come here, the execvp call failed. */
return 1;
}