From: Christian Brauner Date: Mon, 11 Feb 2019 13:35:50 +0000 (+0100) Subject: include: add fexecve() for Android's Bionic X-Git-Tag: lxc-4.0.0~295^2 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=9d361e0fd485941ddf098f9d6696bbd58e7e2d3a;p=mirror_lxc.git include: add fexecve() for Android's Bionic Signed-off-by: Christian Brauner --- diff --git a/src/include/fexecve.c b/src/include/fexecve.c new file mode 100644 index 000000000..be5e27464 --- /dev/null +++ b/src/include/fexecve.c @@ -0,0 +1,57 @@ +/* liblxcapi + * + * Copyright © 2019 Christian Brauner . + * Copyright © 2019 Canonical Ltd. + * + * This 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. + + * This 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 this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + +#include +#include +#include + +#include "config.h" +#include "macro.h" +#include "raw_syscalls.h" + +int fexecve(int fd, char *const argv[], char *const envp[]) +{ + char procfd[LXC_PROC_PID_FD_LEN]; + int ret; + + if (fd < 0 || !argv || !envp) { + errno = EINVAL; + return -1; + } + +#ifdef __NR_execveat + lxc_raw_execveat(fd, "", argv, envp, AT_EMPTY_PATH); + if (errno != ENOSYS) + return -1; +#endif + + ret = snprintf(procfd, sizeof(procfd), "/proc/self/fd/%d", fd); + if (ret < 0 || (size_t)ret >= sizeof(procfd)) { + errno = ENAMETOOLONG; + return -1; + } + + execve(procfd, argv, envp); + return -1; +} diff --git a/src/include/fexecve.h b/src/include/fexecve.h new file mode 100644 index 000000000..f822c18f6 --- /dev/null +++ b/src/include/fexecve.h @@ -0,0 +1,27 @@ +/* liblxcapi + * + * Copyright © 2019 Christian Brauner . + * Copyright © 2019 Canonical Ltd. + * + * This 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. + + * This 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 this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _LXC_FEXECVE_H +#define _LXC_FEXECVE_H + +#include +extern int fexecve(int fd, char *const argv[], char *const envp[]); + +#endif /* _LXC_FEXECVE_H */ diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index dc8aa3d77..e1499a7eb 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -47,7 +47,8 @@ noinst_HEADERS = api_extensions.h \ utils.h if IS_BIONIC -noinst_HEADERS += ../include/lxcmntent.h \ +noinst_HEADERS += ../include/fexecve.h \ + ../include/lxcmntent.h \ ../include/openpty.h endif @@ -145,7 +146,8 @@ liblxc_la_SOURCES = af_unix.c af_unix.h \ $(LSM_SOURCES) if IS_BIONIC -liblxc_la_SOURCES += ../include/lxcmntent.c ../include/lxcmntent.h \ +liblxc_la_SOURCES += ../include/fexecve.c ../include/fexecve.h \ + ../include/lxcmntent.c ../include/lxcmntent.h \ ../include/openpty.c ../include/openpty.h endif diff --git a/src/lxc/rexec.c b/src/lxc/rexec.c index 396bd617f..f08985525 100644 --- a/src/lxc/rexec.c +++ b/src/lxc/rexec.c @@ -31,6 +31,10 @@ #include "string_utils.h" #include "syscall_wrappers.h" +#if IS_BIONIC +#include "../include/fexecve.h" +#endif + #define LXC_MEMFD_REXEC_SEALS \ (F_SEAL_SEAL | F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE)