From 017abdc7a59acf7e76109b7fd285f9856b4a9eee Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Wed, 6 May 2020 04:38:35 +0530 Subject: [PATCH 1/9] libc: add siginterrupt dummy --- repos/libports/src/lib/libc/signal.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/repos/libports/src/lib/libc/signal.cc b/repos/libports/src/lib/libc/signal.cc index a08854a8c0..2d2def34d3 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"))); -- 2.30.0 From e73c873a6e329eef4dede312e0bd0e597c93adde Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Wed, 6 May 2020 04:59:56 +0530 Subject: [PATCH 2/9] libc: add upstream mbsinit --- repos/libports/lib/mk/libc-locale.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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))) -- 2.30.0 From 98d8ef8e3fa37076fab524b6830229f347c89feb Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Wed, 27 May 2020 16:35:16 +0530 Subject: [PATCH 3/9] libc: add mlock and munlock dummies --- repos/libports/src/lib/libc/dummies.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/repos/libports/src/lib/libc/dummies.cc b/repos/libports/src/lib/libc/dummies.cc index b01d95f717..f676b4979c 100644 --- a/repos/libports/src/lib/libc/dummies.cc +++ b/repos/libports/src/lib/libc/dummies.cc @@ -218,5 +218,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" */ -- 2.30.0 From a17d8387a9bbc7d340ed42cfcdc0adedce16f4dd Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Fri, 29 May 2020 09:26:50 +0530 Subject: [PATCH 4/9] libc: return 0 from getpgrp and getppid dummies --- repos/libports/src/lib/libc/dummies.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repos/libports/src/lib/libc/dummies.cc b/repos/libports/src/lib/libc/dummies.cc index f676b4979c..9c568dcc77 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)) -- 2.30.0 From 9f3375cdca705e3271f209de76beb19354a150e8 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 26 Nov 2020 12:47:30 +0100 Subject: [PATCH 5/9] 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 arrays passed to main(…) must always be valid null-terminated arrays. Fix #3955 --- repos/libports/include/libc/args.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/repos/libports/include/libc/args.h b/repos/libports/include/libc/args.h index 76645d82cb..ca9a8fd38a 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,20 @@ 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. + */ + static char const *args[] = { nullptr, 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 + envc + 2) * sizeof(char*)); + envp = &argv[argc+1]; /* read the arguments */ int arg_i = 0; @@ -123,6 +132,8 @@ 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; envp[env_i] = NULL; }); } -- 2.30.0 From dd89c66247bf751c87b09fffc7af15c04a59fd91 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Wed, 2 Dec 2020 16:31:59 +0100 Subject: [PATCH 6/9] libc: implement if_nametoindex --- .../libports/src/lib/libc/socket_fs_plugin.cc | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/repos/libports/src/lib/libc/socket_fs_plugin.cc b/repos/libports/src/lib/libc/socket_fs_plugin.cc index d5db46ff83..fabaf68b5c 100644 --- a/repos/libports/src/lib/libc/socket_fs_plugin.cc +++ b/repos/libports/src/lib/libc/socket_fs_plugin.cc @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include /* libc-internal includes */ @@ -1128,7 +1130,53 @@ extern "C" int getifaddrs(struct ifaddrs **ifap) } -extern "C" void freeifaddrs(struct ifaddrs *) { } +extern "C" void freeifaddrs(struct ifaddrs *) +{ +} + + +static char const * static_if_name = "eth0"; + + +extern "C" unsigned int +if_nametoindex(const char *ifname) +{ + return ::strcmp(ifname, static_if_name) ? 0 : 1; +} + + +extern "C" char * +if_indextoname(unsigned int ifindex, char *ifname) +{ + if (ifindex == 1) { + strncpy(ifname, static_if_name, IFNAMSIZ); + return ifname; + } + return NULL; +} + + +extern "C" struct if_nameindex * +if_nameindex(void) +{ + static struct if_nameindex if_ni_array[2] = { + { + .if_index = 1, + .if_name = (char *)static_if_name + }, + { + .if_index = 0, + .if_name = NULL + } + }; + + return if_ni_array; +} + + +extern "C" void if_freenameindex(struct if_nameindex *ptr) +{ +} /**************************** -- 2.30.0 From 1f249e18ea3972911c1405deb40afd85b8d64dea Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 4 Jun 2020 01:03:37 +0530 Subject: [PATCH 7/9] libc: add readpassphrase This symbol is already in the stub library. --- repos/libports/lib/mk/libc-gen.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/repos/libports/lib/mk/libc-gen.inc b/repos/libports/lib/mk/libc-gen.inc index ab0ce929aa..1c7f84e800 100644 --- a/repos/libports/lib/mk/libc-gen.inc +++ b/repos/libports/lib/mk/libc-gen.inc @@ -40,7 +40,6 @@ FILTER_OUT_C += \ getentropy.c \ getutxent.c \ pututxline.c \ - readpassphrase.c \ scandir_b.c \ sem_new.c \ signal.c \ -- 2.30.0 From 708d1c11c1954636df4eef2efde8f1a5cc4afa7e Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Wed, 2 Dec 2020 22:27:00 +0100 Subject: [PATCH 8/9] libc: replace strange errno values for O_NOFOLLOW Do not replace ENOENT and EEXIST with ELOOP when open is called with O_NOFOLLOW. --- repos/libports/src/lib/libc/vfs_plugin.cc | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/repos/libports/src/lib/libc/vfs_plugin.cc b/repos/libports/src/lib/libc/vfs_plugin.cc index 0947e44740..3b34c134f8 100644 --- a/repos/libports/src/lib/libc/vfs_plugin.cc +++ b/repos/libports/src/lib/libc/vfs_plugin.cc @@ -319,10 +319,6 @@ Libc::File_descriptor *Libc::Vfs_plugin::open_from_kernel(const char *path, int case Result::OPEN_ERR_UNACCESSIBLE: { if (!(flags & O_CREAT)) { - if (flags & O_NOFOLLOW) { - errno = ELOOP; - return 0; - } errno = ENOENT; return 0; } @@ -336,10 +332,6 @@ Libc::File_descriptor *Libc::Vfs_plugin::open_from_kernel(const char *path, int case Result::OPEN_ERR_EXISTS: /* file has been created by someone else in the meantime */ - if (flags & O_NOFOLLOW) { - errno = ELOOP; - return 0; - } errno = EEXIST; return 0; @@ -451,10 +443,6 @@ Libc::File_descriptor *Libc::Vfs_plugin::open(char const *path, int flags) case Result::OPEN_ERR_UNACCESSIBLE: { if (!(flags & O_CREAT)) { - if (flags & O_NOFOLLOW) { - result_errno = ELOOP; - return Fn::COMPLETE; - } result_errno = ENOENT; return Fn::COMPLETE; } @@ -468,10 +456,6 @@ Libc::File_descriptor *Libc::Vfs_plugin::open(char const *path, int flags) case Result::OPEN_ERR_EXISTS: /* file has been created by someone else in the meantime */ - if (flags & O_NOFOLLOW) { - result_errno = ELOOP; - return Fn::COMPLETE; - } result_errno = EEXIST; return Fn::COMPLETE; -- 2.30.0 From 33aac81eee66ae5f218e00b7d596018a2931a784 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sat, 6 Feb 2021 13:45:23 +0100 Subject: [PATCH 9/9] libc: add some missing internal symbols --- repos/libports/lib/mk/libc-gen.inc | 1 - repos/libports/lib/mk/libiconv.mk | 3 ++- repos/libports/src/lib/libc/dummies.cc | 36 ++++++++++++++++++++++++-- repos/libports/src/lib/libc/fork.cc | 3 ++- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/repos/libports/lib/mk/libc-gen.inc b/repos/libports/lib/mk/libc-gen.inc index 1c7f84e800..ab5ac34f2f 100644 --- a/repos/libports/lib/mk/libc-gen.inc +++ b/repos/libports/lib/mk/libc-gen.inc @@ -22,7 +22,6 @@ FILTER_OUT_C += lockf.c # interposing stubs FILTER_OUT_C += \ - elf_utils.c \ sleep.c \ _spinlock_stub.c \ usleep.c \ diff --git a/repos/libports/lib/mk/libiconv.mk b/repos/libports/lib/mk/libiconv.mk index a4154ba6db..ce04c695ce 100644 --- a/repos/libports/lib/mk/libiconv.mk +++ b/repos/libports/lib/mk/libiconv.mk @@ -12,7 +12,8 @@ CC_DEF += -DLIBDIR=\"\" SRC_C := iconv.c \ relocatable.c \ - localcharset.c + localcharset.c \ + citrus_iconv.c SHARED_LIB = yes diff --git a/repos/libports/src/lib/libc/dummies.cc b/repos/libports/src/lib/libc/dummies.cc index 9c568dcc77..cfa78effac 100644 --- a/repos/libports/src/lib/libc/dummies.cc +++ b/repos/libports/src/lib/libc/dummies.cc @@ -37,6 +37,8 @@ extern "C" { #include #include #include +#include +#include #define DUMMY(ret_type, ret_val, name, args) __attribute__((weak)) \ @@ -216,7 +218,9 @@ int __attribute__((weak)) madvise(void *addr, size_t length, int advice) return -1; } -const struct res_sym __p_type_syms[] = { }; +const struct res_sym __p_class_syms[] = { }; +const struct res_sym __p_rcode_syms[] = { }; +const struct res_sym __p_type_syms[] = { }; #define DUMMY_EPERM(ret_type, ret_val, name, args) __attribute__((weak)) \ ret_type name args \ @@ -228,5 +232,33 @@ ret_type name args \ DUMMY_EPERM(int, -1, mlock, (const void *, size_t)); DUMMY_EPERM(int, -1, munlock, (const void *, size_t)); -} /* extern "C" */ +DUMMY(int, -1, sysarch, (int, void *)) + +DUMMY(int, -1, freebsd11_fstat, (struct thread *, struct freebsd11_stat_args *)) +DUMMY(int, -1, freebsd11_lstat, (struct thread *, struct freebsd11_lstat_args *)) +DUMMY(int, -1, freebsd11_readdir, (DIR *, struct freebsd11_dirent *, struct freebsd11_dirent **)) +DUMMY(int, -1, freebsd11_stat, (struct thread *, struct freebsd11_stat_args *)) +DUMMY(int, -1, freebsd11_statfs, (const char *, struct freebsd11_statfs *)) + +DUMMY(int, -1, strunvis, (char *dst, const char *src)) +DUMMY(int, -1, strvisx, (char *, const char *, size_t, int)) +DUMMY(int, -1, unvis, (char *, int, int *, int)) + +DUMMY(const char *, "", loc_ntoa, (const u_char *, char *)) +DUMMY(const char *, "", p_class, (int)) +DUMMY(const char *, "", p_rcode, (int)) +DUMMY(const char *, "", p_section, (int, int)) +DUMMY(const char *, "", p_type, (int)) +DUMMY(char *, NULL, p_secstodate, (u_long)) +DUMMY(int, -1, dn_count_labels, (const char *)) +DUMMY(int, -1, loc_aton, (const char *, u_char *)) +DUMMY(int, -1, sym_ston, (const struct res_sym *, const char *, int *)) +DUMMY(void, , res_pquery, (const res_state, const u_char *, int, FILE *)) +DUMMY(int, -1, clock_getcpuclockid2, (id_t, int, clockid_t *)) + +DUMMY(int, -1, _citrus_iconv_open, (struct _citrus_iconv **, const char *, const char *)) + +DUMMY(int, -1, strtodg, (const char*, char**, FPI*, int*, ULong*)) + +} /* extern "C" */ diff --git a/repos/libports/src/lib/libc/fork.cc b/repos/libports/src/lib/libc/fork.cc index 4f3a9cdd07..3464a338a8 100644 --- a/repos/libports/src/lib/libc/fork.cc +++ b/repos/libports/src/lib/libc/fork.cc @@ -732,7 +732,8 @@ extern "C" pid_t __sys_wait4(pid_t pid, int *status, int options, rusage *rusage return result; } -extern "C" pid_t wait4(pid_t, int *, int, rusage *) __attribute__((weak, alias("__sys_wait4"))); +extern "C" pid_t wait4(pid_t, int *, int, rusage *) __attribute__((weak, alias("__sys_wait4"))); +extern "C" pid_t _wait4(pid_t, int *, int, rusage *) __attribute__((weak, alias("__sys_wait4"))); void Libc::init_fork(Env &env, Config_accessor const &config_accessor, -- 2.30.0