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-2.0.10~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=27bc47079fc20fa60e2df97d8b22c97bb83d3e3f;p=thirdparty%2Flxc.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..21ccfe877 --- /dev/null +++ b/src/include/fexecve.c @@ -0,0 +1,68 @@ +/* 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 +#include + +#include "config.h" + +static int lxc_raw_execveat(int dirfd, const char *pathname, char *const argv[], + char *const envp[], int flags) +{ +#ifdef __NR_execveat + syscall(__NR_execveat, dirfd, pathname, argv, envp, flags); +#else + errno = ENOSYS; +#endif + return -1; +} + +int efexecve(int fd, char *const argv[], char *const envp[]) +{ + char procfd[256]; + 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..14589d798 --- /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 efexecve(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 96f139dac..c27c10505 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -41,6 +41,7 @@ noinst_HEADERS = \ if IS_BIONIC noinst_HEADERS += \ + ../include/fexecve.h \ ../include/ifaddrs.h \ ../include/openpty.h \ ../include/lxcmntent.h @@ -137,6 +138,7 @@ endif if IS_BIONIC liblxc_la_SOURCES += \ + ../include/fexecve.c ../include/fexecve.h \ ../include/ifaddrs.c ../include/ifaddrs.h \ ../include/openpty.c ../include/openpty.h \ ../include/lxcmntent.c ../include/lxcmntent.h diff --git a/src/lxc/rexec.c b/src/lxc/rexec.c index 7b55ff704..29bfd859e 100644 --- a/src/lxc/rexec.c +++ b/src/lxc/rexec.c @@ -34,6 +34,10 @@ #include "config.h" #include "utils.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)