Remove the linux_exec_copyin_args(), freebsd32_exec_copyin_args() may
server as well. COMPAT_FREEBSD32 is a prerequisite for COMPAT_LINUX32. Reviewed by: alc MFC after: 3 weeks
This commit is contained in:
parent
aa17bd87c6
commit
229b3b9c19
@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <vm/vm_kern.h>
|
||||
#include <vm/vm_map.h>
|
||||
|
||||
#include <compat/freebsd32/freebsd32_util.h>
|
||||
#include <amd64/linux32/linux.h>
|
||||
#include <amd64/linux32/linux32_proto.h>
|
||||
#include <compat/linux/linux_ipc.h>
|
||||
@ -107,103 +108,6 @@ bsd_to_linux_sigaltstack(int bsa)
|
||||
return (lsa);
|
||||
}
|
||||
|
||||
/*
|
||||
* Custom version of exec_copyin_args() so that we can translate
|
||||
* the pointers.
|
||||
*/
|
||||
static int
|
||||
linux_exec_copyin_args(struct image_args *args, char *fname,
|
||||
enum uio_seg segflg, char **argv, char **envv)
|
||||
{
|
||||
char *argp, *envp;
|
||||
u_int32_t *p32, arg;
|
||||
size_t length;
|
||||
int error;
|
||||
|
||||
bzero(args, sizeof(*args));
|
||||
if (argv == NULL)
|
||||
return (EFAULT);
|
||||
|
||||
/*
|
||||
* Allocate temporary demand zeroed space for argument and
|
||||
* environment strings
|
||||
*/
|
||||
args->buf = (char *)kmem_alloc_wait(exec_map,
|
||||
PATH_MAX + ARG_MAX + MAXSHELLCMDLEN);
|
||||
if (args->buf == NULL)
|
||||
return (ENOMEM);
|
||||
args->begin_argv = args->buf;
|
||||
args->endp = args->begin_argv;
|
||||
args->stringspace = ARG_MAX;
|
||||
|
||||
args->fname = args->buf + ARG_MAX;
|
||||
|
||||
/*
|
||||
* Copy the file name.
|
||||
*/
|
||||
error = (segflg == UIO_SYSSPACE) ?
|
||||
copystr(fname, args->fname, PATH_MAX, &length) :
|
||||
copyinstr(fname, args->fname, PATH_MAX, &length);
|
||||
if (error != 0)
|
||||
goto err_exit;
|
||||
|
||||
/*
|
||||
* extract arguments first
|
||||
*/
|
||||
p32 = (u_int32_t *)argv;
|
||||
for (;;) {
|
||||
error = copyin(p32++, &arg, sizeof(arg));
|
||||
if (error)
|
||||
goto err_exit;
|
||||
if (arg == 0)
|
||||
break;
|
||||
argp = PTRIN(arg);
|
||||
error = copyinstr(argp, args->endp, args->stringspace, &length);
|
||||
if (error) {
|
||||
if (error == ENAMETOOLONG)
|
||||
error = E2BIG;
|
||||
|
||||
goto err_exit;
|
||||
}
|
||||
args->stringspace -= length;
|
||||
args->endp += length;
|
||||
args->argc++;
|
||||
}
|
||||
|
||||
args->begin_envv = args->endp;
|
||||
|
||||
/*
|
||||
* extract environment strings
|
||||
*/
|
||||
if (envv) {
|
||||
p32 = (u_int32_t *)envv;
|
||||
for (;;) {
|
||||
error = copyin(p32++, &arg, sizeof(arg));
|
||||
if (error)
|
||||
goto err_exit;
|
||||
if (arg == 0)
|
||||
break;
|
||||
envp = PTRIN(arg);
|
||||
error = copyinstr(envp, args->endp, args->stringspace,
|
||||
&length);
|
||||
if (error) {
|
||||
if (error == ENAMETOOLONG)
|
||||
error = E2BIG;
|
||||
goto err_exit;
|
||||
}
|
||||
args->stringspace -= length;
|
||||
args->endp += length;
|
||||
args->envc++;
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
|
||||
err_exit:
|
||||
exec_free_args(args);
|
||||
return (error);
|
||||
}
|
||||
|
||||
int
|
||||
linux_execve(struct thread *td, struct linux_execve_args *args)
|
||||
{
|
||||
@ -218,8 +122,8 @@ linux_execve(struct thread *td, struct linux_execve_args *args)
|
||||
printf(ARGS(execve, "%s"), path);
|
||||
#endif
|
||||
|
||||
error = linux_exec_copyin_args(&eargs, path, UIO_SYSSPACE, args->argp,
|
||||
args->envp);
|
||||
error = freebsd32_exec_copyin_args(&eargs, path, UIO_SYSSPACE,
|
||||
args->argp, args->envp);
|
||||
free(path, M_TEMP);
|
||||
if (error == 0)
|
||||
error = kern_execve(td, &eargs, NULL);
|
||||
|
@ -54,8 +54,8 @@
|
||||
l_int mode); }
|
||||
9 AUE_LINK STD { int linux_link(char *path, char *to); }
|
||||
10 AUE_UNLINK STD { int linux_unlink(char *path); }
|
||||
11 AUE_EXECVE STD { int linux_execve(char *path, char **argp, \
|
||||
char **envp); }
|
||||
11 AUE_EXECVE STD { int linux_execve(char *path, u_int32_t *argp, \
|
||||
u_int32_t *envp); }
|
||||
12 AUE_CHDIR STD { int linux_chdir(char *path); }
|
||||
13 AUE_NULL STD { int linux_time(l_time_t *tm); }
|
||||
14 AUE_MKNOD STD { int linux_mknod(char *path, l_int mode, \
|
||||
|
@ -265,7 +265,7 @@ freebsd32_sigaltstack(struct thread *td,
|
||||
* Custom version of exec_copyin_args() so that we can translate
|
||||
* the pointers.
|
||||
*/
|
||||
static int
|
||||
int
|
||||
freebsd32_exec_copyin_args(struct image_args *args, char *fname,
|
||||
enum uio_seg segflg, u_int32_t *argv, u_int32_t *envv)
|
||||
{
|
||||
|
@ -101,5 +101,9 @@ int freebsd32_copyiniov(struct iovec32 *iovp, u_int iovcnt,
|
||||
struct iovec **iov, int error);
|
||||
void freebsd32_rusage_out(const struct rusage *s, struct rusage32 *s32);
|
||||
|
||||
enum uio_seg;
|
||||
struct image_args;
|
||||
int freebsd32_exec_copyin_args(struct image_args *args, char *fname,
|
||||
enum uio_seg segflg, u_int32_t *argv, u_int32_t *envv);
|
||||
|
||||
#endif /* !_COMPAT_FREEBSD32_FREEBSD32_UTIL_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user