commit f3a7fb548c8600a6e290d306b933725ebc546cd0 Author: Emery Hemingway Date: Wed May 6 04:38:35 2020 +0530 libc: add siginterrupt dummy diff --git a/repos/libports/src/lib/libc/signal.cc b/repos/libports/src/lib/libc/signal.cc index dc9af2d443..784257c48e 100644 --- a/repos/libports/src/lib/libc/signal.cc +++ b/repos/libports/src/lib/libc/signal.cc @@ -131,6 +131,9 @@ extern "C" int sigaction(int signum, const struct sigaction *act, struct sigacti } +extern "C" int siginterrupt(int sig, int flag) { return 0; }; + + extern "C" int _sigaction(int, const struct sigaction *, struct sigaction *) __attribute__((weak, alias("sigaction"))); extern "C" int __sys_sigaction(int, const struct sigaction *, struct sigaction *) __attribute__((weak, alias("sigaction"))); extern "C" int __libc_sigaction(int, const struct sigaction *, struct sigaction *) __attribute__((weak, alias("sigaction"))); commit 65244c99c250767922b9afca9663ddcb7a7753f8 Author: Emery Hemingway Date: Wed May 6 04:59:56 2020 +0530 libc: add upstream mbsinit diff --git a/repos/libports/lib/mk/libc-locale.mk b/repos/libports/lib/mk/libc-locale.mk index 8e75e59589..2bb98b1456 100644 --- a/repos/libports/lib/mk/libc-locale.mk +++ b/repos/libports/lib/mk/libc-locale.mk @@ -6,7 +6,7 @@ CC_OPT += -D_Thread_local="" FILTER_OUT = \ c16rtomb.c c32rtomb_iconv.c mbrtoc16_iconv.c mbrtoc32_iconv.c \ setlocale.c xlocale.c setrunelocale.c \ - ascii.c big5.c euc.co gb18030.c gb2312.c gbk.c mbsinit.c mskanji.c utf8.c \ + ascii.c big5.c euc.co gb18030.c gb2312.c gbk.c mskanji.c utf8.c \ SRC_C = $(filter-out $(FILTER_OUT),$(notdir $(wildcard $(LIBC_LOCALE_DIR)/*.c))) commit 81fc78f8e0ac66a7275e149f7f7fdc5f4f1f2979 Author: Emery Hemingway Date: Wed May 27 16:35:16 2020 +0530 libc: add mlock and munlock dummies diff --git a/repos/libports/src/lib/libc/dummies.cc b/repos/libports/src/lib/libc/dummies.cc index 37c2c83f89..bc2f15a90a 100644 --- a/repos/libports/src/lib/libc/dummies.cc +++ b/repos/libports/src/lib/libc/dummies.cc @@ -221,5 +221,15 @@ int __attribute__((weak)) madvise(void *addr, size_t length, int advice) const struct res_sym __p_type_syms[] = { }; +#define DUMMY_EPERM(ret_type, ret_val, name, args) __attribute__((weak)) \ +ret_type name args \ +{ \ + errno = EPERM; \ + return ret_val; \ +} + +DUMMY_EPERM(int, -1, mlock, (const void *, size_t)); +DUMMY_EPERM(int, -1, munlock, (const void *, size_t)); + } /* extern "C" */ commit f45e11626aca92be04bc9c8ed74f010ff62862dd Author: Emery Hemingway Date: Fri May 29 09:26:50 2020 +0530 libc: return 0 from getpgrp and getppid dummies diff --git a/repos/libports/src/lib/libc/dummies.cc b/repos/libports/src/lib/libc/dummies.cc index 150640ddf3..e511897600 100644 --- a/repos/libports/src/lib/libc/dummies.cc +++ b/repos/libports/src/lib/libc/dummies.cc @@ -109,8 +109,8 @@ DUMMY(char *, 0, _getlogin, (void)) DUMMY(int , -1, getnameinfo, (const sockaddr *, socklen_t, char *, size_t, char *, size_t, int)) DUMMY(struct servent *, 0, getservbyname, (const char *, const char *)) DUMMY(int , -1, getsid, (pid_t)) -DUMMY_SILENT(pid_t , -1, getppid, (void)) -DUMMY(pid_t , -1, getpgrp, (void)) +DUMMY_SILENT(pid_t , 0, getpgrp, (void)) +DUMMY_SILENT(pid_t , 0, getppid, (void)) DUMMY(int , -1, getpriority, (int, int)) DUMMY(int , -1, getrusage, (int, rusage *)) DUMMY_SILENT(uid_t , 0, getuid, (void)) From 01bac4b0add9da8bbb4fcbe339605533ab7e7be5 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 26 Nov 2020 12:47:30 +0100 Subject: [PATCH] libc: always set argv and envp to valid arrays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The argument array passed to main(…) must be a null terminated array, even if argc is zero. Set at least one environment variable in any case. Fix #3955 --- repos/libports/include/libc/args.h | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/repos/libports/include/libc/args.h b/repos/libports/include/libc/args.h index 76645d82cb..fab299b8d3 100644 --- a/repos/libports/include/libc/args.h +++ b/repos/libports/include/libc/args.h @@ -25,6 +25,7 @@ static void populate_args_and_env(Libc::Env &env, int &argc, char **&argv, char { using Genode::Xml_node; using Genode::Xml_attribute; + using Genode::max; env.config([&] (Xml_node const &node) { @@ -40,12 +41,25 @@ static void populate_args_and_env(Libc::Env &env, int &argc, char **&argv, char ++envc; }); - if (argc == 0 && envc == 0) + if (argc == 0 && envc == 0) { + /* + * If argc is zero then argv is still a NULL-terminated array. + * + * Invent an enviromental variable in case the application + * does not handle an empty environment. SHLVL=0 is + * just an indication that this application lacks a parent + * shell. + */ + static char const *args[] = { nullptr, "SHLVL=0", nullptr }; + argc = 0; + argv = (char**)&args; + envp = &argv[1]; return; /* from lambda */ + } - /* arguments and environment are a contiguous array (but don't count on it) */ - argv = (char**)malloc((argc + envc + 1) * sizeof(char*)); - envp = &argv[argc]; + /* arguments and environment are arranged System V style (but don't count on it) */ + argv = (char**)malloc((argc + max(envc, 1) + 2) * sizeof(char*)); + envp = &argv[argc+1]; /* read the arguments */ int arg_i = 0; @@ -123,6 +137,13 @@ static void populate_args_and_env(Libc::Env &env, int &argc, char **&argv, char catch (Xml_node::Nonexistent_attribute) { } }); + /* argv and envp are both NULL terminated */ + + argv[arg_i] = NULL; + + /* invent an env-var if none are present, see note above */ + if (env_i == 0) + envp[env_i++] = (char*)"SHLVL=0"; envp[env_i] = NULL; }); } -- 2.29.2