diff options
Diffstat (limited to 'meta/recipes-devtools/pseudo/files')
9 files changed, 136 insertions, 593 deletions
diff --git a/meta/recipes-devtools/pseudo/files/0001-Use-epoll-API-on-Linux.patch b/meta/recipes-devtools/pseudo/files/0001-Use-epoll-API-on-Linux.patch deleted file mode 100644 index 42557b17a7..0000000000 --- a/meta/recipes-devtools/pseudo/files/0001-Use-epoll-API-on-Linux.patch +++ /dev/null @@ -1,292 +0,0 @@ -From 9e407e0be01695e7b927f5820ade87ee9602c248 Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin <alex.kanavin@gmail.com> -Date: Fri, 15 Sep 2017 17:00:14 +0300 -Subject: [PATCH] Use epoll API on Linux - -Also a couple of other modifications due to epoll having -a different approach to how the working set of fds is defined -and used: -1) open_client() returns an index into the array of clients -2) close_client() has a protection against being called twice -with the same client (which would mess up the active_clients -counter) - -Upstream-Status: Submitted [Seebs CC'd by email] -Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> - ---- - enums/exit_status.in | 3 + - pseudo_server.c | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++- - 2 files changed, 190 insertions(+), 2 deletions(-) - -diff --git a/enums/exit_status.in b/enums/exit_status.in -index 6be44d3..88f94cd 100644 ---- a/enums/exit_status.in -+++ b/enums/exit_status.in -@@ -18,3 +18,6 @@ listen_fd, "server loop had no valid listen fd" - pseudo_loaded, "server couldn't get out of pseudo environment" - pseudo_prefix, "couldn't get valid pseudo prefix" - pseudo_invocation, "invalid server command arguments" -+epoll_create, "epoll_create() failed" -+epoll_ctl, "epoll_ctl() failed" -+ -diff --git a/pseudo_server.c b/pseudo_server.c -index ff16efd..14d34de 100644 ---- a/pseudo_server.c -+++ b/pseudo_server.c -@@ -40,6 +40,12 @@ - #include "pseudo_client.h" - #include "pseudo_db.h" - -+// This has to come after pseudo includes, as that's where PSEUDO_PORT defines are -+#ifdef PSEUDO_PORT_LINUX -+#include <sys/epoll.h> -+#endif -+ -+ - static int listen_fd = -1; - - typedef struct { -@@ -59,6 +65,7 @@ static int active_clients = 0, highest_client = 0, max_clients = 0; - - #define LOOP_DELAY 2 - #define DEFAULT_PSEUDO_SERVER_TIMEOUT 30 -+#define EPOLL_MAX_EVENTS 10 - int pseudo_server_timeout = DEFAULT_PSEUDO_SERVER_TIMEOUT; - static int die_peacefully = 0; - static int die_forcefully = 0; -@@ -80,6 +87,9 @@ quit_now(int signal) { - static int messages = 0, responses = 0; - static struct timeval message_time = { .tv_sec = 0 }; - -+#ifdef PSEUDO_PORT_LINUX -+static void pseudo_server_loop_epoll(void); -+#endif - static void pseudo_server_loop(void); - - /* helper function to make a directory, just like mkdir -p. -@@ -369,12 +379,16 @@ pseudo_server_start(int daemonize) { - kill(ppid, SIGUSR1); - } - } -+#ifdef PSEUDO_PORT_LINUX -+ pseudo_server_loop_epoll(); -+#else - pseudo_server_loop(); -+#endif - return 0; - } - - /* mess with internal tables as needed */ --static void -+static unsigned int - open_client(int fd) { - pseudo_client_t *new_clients; - int i; -@@ -390,7 +404,7 @@ open_client(int fd) { - ++active_clients; - if (i > highest_client) - highest_client = i; -- return; -+ return i; - } - } - -@@ -414,9 +428,11 @@ open_client(int fd) { - - max_clients += 16; - ++active_clients; -+ return max_clients - 16; - } else { - pseudo_diag("error allocating new client, fd %d\n", fd); - close(fd); -+ return 0; - } - } - -@@ -433,6 +449,10 @@ close_client(int client) { - client, highest_client); - return; - } -+ if (clients[client].fd == -1) { -+ pseudo_debug(PDBGF_SERVER, "client %d already closed\n", client); -+ return; -+ } - close(clients[client].fd); - clients[client].fd = -1; - free(clients[client].tag); -@@ -566,6 +586,171 @@ serve_client(int i) { - } - } - -+#ifdef PSEUDO_PORT_LINUX -+static void pseudo_server_loop_epoll(void) -+{ -+ struct sockaddr_un client; -+ socklen_t len; -+ int i; -+ int rc; -+ int fd; -+ int timeout; -+ struct epoll_event ev, events[EPOLL_MAX_EVENTS]; -+ int loop_timeout = pseudo_server_timeout; -+ -+ clients = malloc(16 * sizeof(*clients)); -+ -+ clients[0].fd = listen_fd; -+ clients[0].pid = getpid(); -+ -+ for (i = 1; i < 16; ++i) { -+ clients[i].fd = -1; -+ clients[i].pid = 0; -+ clients[i].tag = NULL; -+ clients[i].program = NULL; -+ } -+ -+ active_clients = 1; -+ max_clients = 16; -+ highest_client = 0; -+ -+ pseudo_debug(PDBGF_SERVER, "server loop started.\n"); -+ if (listen_fd < 0) { -+ pseudo_diag("got into loop with no valid listen fd.\n"); -+ exit(PSEUDO_EXIT_LISTEN_FD); -+ } -+ -+ timeout = LOOP_DELAY * 1000; -+ -+ int epollfd = epoll_create1(0); -+ if (epollfd == -1) { -+ pseudo_diag("epoll_create1() failed.\n"); -+ exit(PSEUDO_EXIT_EPOLL_CREATE); -+ } -+ ev.events = EPOLLIN; -+ ev.data.u64 = 0; -+ if (epoll_ctl(epollfd, EPOLL_CTL_ADD, clients[0].fd, &ev) == -1) { -+ pseudo_diag("epoll_ctl() failed with listening socket.\n"); -+ exit(PSEUDO_EXIT_EPOLL_CTL); -+ } -+ -+ pdb_log_msg(SEVERITY_INFO, NULL, NULL, NULL, "server started (pid %d)", getpid()); -+ -+ for (;;) { -+ rc = epoll_wait(epollfd, events, EPOLL_MAX_EVENTS, timeout); -+ if (rc == 0 || (rc == -1 && errno == EINTR)) { -+ /* If there's no clients, start timing out. If there -+ * are active clients, never time out. -+ */ -+ if (active_clients == 1) { -+ loop_timeout -= LOOP_DELAY; -+ /* maybe flush database to disk */ -+ pdb_maybe_backup(); -+ if (loop_timeout <= 0) { -+ pseudo_debug(PDBGF_SERVER, "no more clients, got bored.\n"); -+ die_peacefully = 1; -+ } else { -+ /* display this if not exiting */ -+ pseudo_debug(PDBGF_SERVER | PDBGF_BENCHMARK, "%d messages handled in %.4f seconds, %d responses\n", -+ messages, -+ (double) message_time.tv_sec + -+ (double) message_time.tv_usec / 1000000.0, -+ responses); -+ } -+ } -+ } else if (rc > 0) { -+ loop_timeout = pseudo_server_timeout; -+ for (i = 0; i < rc; ++i) { -+ if (clients[events[i].data.u64].fd == listen_fd) { -+ if (!die_forcefully) { -+ len = sizeof(client); -+ if ((fd = accept(listen_fd, (struct sockaddr *) &client, &len)) != -1) { -+ /* Don't allow clients to end up on fd 2, because glibc's -+ * malloc debug uses that fd unconditionally. -+ */ -+ if (fd == 2) { -+ int newfd = fcntl(fd, F_DUPFD, 3); -+ close(fd); -+ fd = newfd; -+ } -+ pseudo_debug(PDBGF_SERVER, "new client fd %d\n", fd); -+ /* A new client implicitly cancels any -+ * previous shutdown request, or a -+ * shutdown for lack of clients. -+ */ -+ pseudo_server_timeout = DEFAULT_PSEUDO_SERVER_TIMEOUT; -+ die_peacefully = 0; -+ -+ ev.events = EPOLLIN; -+ ev.data.u64 = open_client(fd); -+ if (ev.data.u64 != 0 && epoll_ctl(epollfd, EPOLL_CTL_ADD, clients[ev.data.u64].fd, &ev) == -1) { -+ pseudo_diag("epoll_ctl() failed with accepted socket.\n"); -+ exit(PSEUDO_EXIT_EPOLL_CTL); -+ } -+ } else if (errno == EMFILE) { -+ pseudo_debug(PDBGF_SERVER, "Hit max open files, dropping a client.\n"); -+ /* In theory there is a potential race here where if we close a client, -+ it may have sent us a fastop message which we don't act upon. -+ If we don't close a filehandle we'll loop indefinitely thought. -+ Only close one per loop iteration in the interests of caution */ -+ for (int j = 1; j <= highest_client; ++j) { -+ if (clients[j].fd != -1) { -+ close_client(j); -+ break; -+ } -+ } -+ } -+ } -+ } else { -+ struct timeval tv1, tv2; -+ int rc; -+ gettimeofday(&tv1, NULL); -+ rc = serve_client(events[i].data.u64); -+ gettimeofday(&tv2, NULL); -+ ++messages; -+ if (rc == 0) -+ ++responses; -+ message_time.tv_sec += (tv2.tv_sec - tv1.tv_sec); -+ message_time.tv_usec += (tv2.tv_usec - tv1.tv_usec); -+ if (message_time.tv_usec < 0) { -+ message_time.tv_usec += 1000000; -+ --message_time.tv_sec; -+ } else while (message_time.tv_usec > 1000000) { -+ message_time.tv_usec -= 1000000; -+ ++message_time.tv_sec; -+ } -+ } -+ if (die_forcefully) -+ break; -+ } -+ pseudo_debug(PDBGF_SERVER, "server loop complete [%d clients left]\n", active_clients); -+ } else { -+ pseudo_diag("epoll_wait failed: %s\n", strerror(errno)); -+ break; -+ } -+ if (die_peacefully || die_forcefully) { -+ pseudo_debug(PDBGF_SERVER, "quitting.\n"); -+ pseudo_debug(PDBGF_SERVER | PDBGF_BENCHMARK, "server %d exiting: handled %d messages in %.4f seconds\n", -+ getpid(), messages, -+ (double) message_time.tv_sec + -+ (double) message_time.tv_usec / 1000000.0); -+ pdb_log_msg(SEVERITY_INFO, NULL, NULL, NULL, "server %d exiting: handled %d messages in %.4f seconds", -+ getpid(), messages, -+ (double) message_time.tv_sec + -+ (double) message_time.tv_usec / 1000000.0); -+ /* and at this point, we'll start refusing connections */ -+ close(clients[0].fd); -+ /* This is a good place to insert a delay for -+ * debugging race conditions during startup. */ -+ /* usleep(300000); */ -+ exit(0); -+ } -+ } -+ -+} -+ -+#endif -+ - /* get clients, handle messages, shut down. - * This doesn't actually do any work, it just calls a ton of things which - * do work. --- -2.14.1 - diff --git a/meta/recipes-devtools/pseudo/files/b6b68db896f9963558334aff7fca61adde4ec10f.patch b/meta/recipes-devtools/pseudo/files/b6b68db896f9963558334aff7fca61adde4ec10f.patch deleted file mode 100644 index 3045a3b736..0000000000 --- a/meta/recipes-devtools/pseudo/files/b6b68db896f9963558334aff7fca61adde4ec10f.patch +++ /dev/null @@ -1,48 +0,0 @@ -From b6b68db896f9963558334aff7fca61adde4ec10f Mon Sep 17 00:00:00 2001 -From: Seebs <seebs@seebs.net> -Date: Thu, 13 Apr 2017 18:12:01 -0500 -Subject: Prevent bash from segfaulting when unloading pseudo - -bash's extremely fancy internal awareness of how the environment looks -means that, if you directly call the underlying libc "unsetenv" on -a variable, bash can end up trying to access a null pointer. Fixing -this generically is actually rather hard; you can't really avoid -writing to environ on fork() or popen(), even if you change all -execv*() functions to use the execv*e() variants. So for now, instead -of unsetting the variable, set it to an empty string. - -Thanks to Saur in IRC for spotting this and helping debug it. - -Signed-off-by: Seebs <seebs@seebs.net> - -Upstream-Status: Backport - -diff --git a/ChangeLog.txt b/ChangeLog.txt -index a2d30e9..8ba1ffa 100644 ---- a/ChangeLog.txt -+++ b/ChangeLog.txt -@@ -1,3 +1,8 @@ -+2017-04-13: -+ * (seebs) don't unset LD_PRELOAD or the like, because if you -+ do that, bash can segfault because it "knows" how many -+ fields are in environ. -+ - 2017-02-24: - * (seebs) import posix_acl_default fix from Anton Gerasimov - <anton@advancedtelematic.com> -diff --git a/pseudo_util.c b/pseudo_util.c -index 172990b..6a1fac2 100644 ---- a/pseudo_util.c -+++ b/pseudo_util.c -@@ -844,7 +844,7 @@ void pseudo_dropenv() { - if (ld_preload && strlen(ld_preload)) { - SETENV(PRELINK_LIBRARIES, ld_preload, 1); - } else { -- UNSETENV(PRELINK_LIBRARIES); -+ SETENV(PRELINK_LIBRARIES, "", 1); - } - } - } --- -cgit v0.10.2 - diff --git a/meta/recipes-devtools/pseudo/files/build-oldlibc b/meta/recipes-devtools/pseudo/files/build-oldlibc new file mode 100755 index 0000000000..85c438de4e --- /dev/null +++ b/meta/recipes-devtools/pseudo/files/build-oldlibc @@ -0,0 +1,20 @@ +#!/bin/sh +# +# Script to re-generate pseudo-prebuilt-2.33.tar.xz +# +# Copyright (C) 2021 Richard Purdie +# +# SPDX-License-Identifier: GPL-2.0-only +# + +for i in x86_64 aarch64 i686; do + if [ ! -e $i-nativesdk-libc.tar.xz ]; then + wget http://downloads.yoctoproject.org/releases/uninative/3.2/$i-nativesdk-libc.tar.xz + fi + tar -xf $i-nativesdk-libc.tar.xz --wildcards \*/lib/libpthread\* \*/lib/libdl\* + cd $i-linux/lib + ln -s libdl.so.2 libdl.so + ln -s libpthread.so.0 libpthread.so + cd ../.. +done +tar -cJf pseudo-prebuilt-2.33.tar.xz *-linux
\ No newline at end of file diff --git a/meta/recipes-devtools/pseudo/files/efe0be279901006f939cd357ccee47b651c786da.patch b/meta/recipes-devtools/pseudo/files/efe0be279901006f939cd357ccee47b651c786da.patch deleted file mode 100644 index 64fc58c4fe..0000000000 --- a/meta/recipes-devtools/pseudo/files/efe0be279901006f939cd357ccee47b651c786da.patch +++ /dev/null @@ -1,99 +0,0 @@ -From efe0be279901006f939cd357ccee47b651c786da Mon Sep 17 00:00:00 2001 -From: Seebs <seebs@seebs.net> -Date: Fri, 24 Feb 2017 12:47:38 -0600 -Subject: Don't try to record 0-length posix_acl_default xattrs - -Based on a submission from Anton Gerasimov <anton@advancedtelematic.com> - -On some systems, with some kernel configs, "cp -a" apparently tries to -set an empty ACL list, with a valid header but no contents, which causes -strange and mysterious behavior later if we actually create such an entry. -So filter that out, also sanity-check a couple of other things. - -Signed-off-by: Seebs <seebs@seebs.net> - -Upstream-Status: Backport - -diff --git a/ChangeLog.txt b/ChangeLog.txt -index ae2a6e9..a2d30e9 100644 ---- a/ChangeLog.txt -+++ b/ChangeLog.txt -@@ -1,3 +1,6 @@ -+2017-02-24: -+ * (seebs) import posix_acl_default fix from Anton Gerasimov -+ <anton@advancedtelematic.com> - 2017-02-01: - * (seebs) handle xattr deletion slightly more carefully. - * (seebs) tag this as 1.8.2 -diff --git a/ports/linux/xattr/pseudo_wrappers.c b/ports/linux/xattr/pseudo_wrappers.c -index 46bc053..d69d53e 100644 ---- a/ports/linux/xattr/pseudo_wrappers.c -+++ b/ports/linux/xattr/pseudo_wrappers.c -@@ -62,9 +62,9 @@ static int - posix_permissions(const acl_header *header, int entries, int *extra, int *mode) { - int acl_seen = 0; - if (le32(header->version) != 2) { -- pseudo_diag("Fatal: ACL support no available for header version %d.\n", -+ pseudo_diag("Fatal: ACL support not available for header version %d.\n", - le32(header->version)); -- return 1; -+ return -1; - } - *mode = 0; - *extra = 0; -@@ -140,12 +140,38 @@ static int shared_setxattr(const char *path, int fd, const char *name, const voi - pseudo_debug(PDBGF_XATTR, "setxattr(%s [fd %d], %s => '%.*s')\n", - path ? path : "<no path>", fd, name, (int) size, (char *) value); - -+ /* Filter out erroneous sizes for POSIX ACL -+ * see posix_acl_xattr_count in include/linux/posix_acl_xattr.h of Linux source code */ -+ /* I don't think there's any posix_acl_* values that aren't in this format */ -+ if (!strncmp(name, "system.posix_acl_", 17)) { -+ // ACL is corrupt, issue an error -+ if(size < sizeof(acl_header) || (size - sizeof(acl_header)) % sizeof(acl_entry) != 0) { -+ pseudo_debug(PDBGF_XATTR, "invalid data size for %s: %d\n", -+ name, (int) size); -+ errno = EINVAL; -+ return -1; -+ } -+ -+ // ACL is empty, do nothing -+ if((size - sizeof(acl_header)) / sizeof(acl_entry) == 0) { -+ /* on some systems, "cp -a" will attempt to clone the -+ * posix_acl_default entry for a directory (which would specify -+ * default ACLs for new files in that directory), but if the -+ * original was empty, we get a header but no entries. With -+ * real xattr, that ends up being silently discarded, apparently, -+ * so we discard it too. -+ */ -+ pseudo_debug(PDBGF_XATTR, "0-length ACL entry %s.\n", name); -+ return 0; -+ } -+ } - /* this may be a plain chmod */ - if (!strcmp(name, "system.posix_acl_access")) { - int extra; - int mode; - int entries = (size - sizeof(acl_header)) / sizeof(acl_entry); -- if (!posix_permissions(value, entries, &extra, &mode)) { -+ int res = posix_permissions(value, entries, &extra, &mode); -+ if (res == 0) { - pseudo_debug(PDBGF_XATTR, "posix_acl_access translated to mode %04o. Remaining attribute(s): %d.\n", - mode, extra); - buf.st_mode = mode; -@@ -164,8 +190,12 @@ static int shared_setxattr(const char *path, int fd, const char *name, const voi - if (!extra) { - return 0; - } -+ } else if (res == -1) { -+ errno = EOPNOTSUPP; -+ return -1; - } - } -+ - if (!strcmp(name, "user.pseudo_data")) { - pseudo_debug(PDBGF_XATTR | PDBGF_XATTRDB, "user.pseudo_data xattribute does not get to go in database.\n"); - return -1; --- -cgit v0.10.2 - diff --git a/meta/recipes-devtools/pseudo/files/fastopreply.patch b/meta/recipes-devtools/pseudo/files/fastopreply.patch deleted file mode 100644 index 904c2d04e6..0000000000 --- a/meta/recipes-devtools/pseudo/files/fastopreply.patch +++ /dev/null @@ -1,76 +0,0 @@ -Ensure FASTOP messages get an ACK reply so that the client can be sure the server -recieved them. This means if connections are terminated, data isn't lost. - -RP 2017/9/22 - -Upstream-Status: Submitted - -Index: pseudo-1.8.2/pseudo_client.c -=================================================================== ---- pseudo-1.8.2.orig/pseudo_client.c -+++ pseudo-1.8.2/pseudo_client.c -@@ -1331,21 +1331,19 @@ pseudo_client_request(pseudo_msg_t *msg, - * indicating a successful send. - */ - pseudo_debug(PDBGF_CLIENT | PDBGF_VERBOSE, "sent!\n"); -- if (msg->type != PSEUDO_MSG_FASTOP) { -- response = pseudo_msg_receive(connect_fd); -- if (!response) { -- pseudo_debug(PDBGF_CLIENT, "expected response did not occur; retrying\n"); -+ response = pseudo_msg_receive(connect_fd); -+ if (!response) { -+ pseudo_debug(PDBGF_CLIENT, "expected response did not occur; retrying\n"); -+ } else { -+ if (response->type != PSEUDO_MSG_ACK) { -+ pseudo_debug(PDBGF_CLIENT, "got non-ack response %d\n", response->type); -+ return 0; -+ } else if (msg->type != PSEUDO_MSG_FASTOP) { -+ pseudo_debug(PDBGF_CLIENT | PDBGF_VERBOSE, "got response type %d\n", response->type); -+ return response; - } else { -- if (response->type != PSEUDO_MSG_ACK) { -- pseudo_debug(PDBGF_CLIENT, "got non-ack response %d\n", response->type); -- return 0; -- } else { -- pseudo_debug(PDBGF_CLIENT | PDBGF_VERBOSE, "got response type %d\n", response->type); -- return response; -- } -+ return 0; - } -- } else { -- return 0; - } - } - pseudo_diag("pseudo: server connection persistently failed, aborting.\n"); -Index: pseudo-1.8.2/pseudo_server.c -=================================================================== ---- pseudo-1.8.2.orig/pseudo_server.c -+++ pseudo-1.8.2/pseudo_server.c -@@ -463,6 +463,11 @@ close_client(int client) { - --highest_client; - } - -+static pseudo_msg_t server_fastop_reply = { -+ .type = PSEUDO_MSG_ACK, -+ .op = OP_NONE, -+}; -+ - /* Actually process a request. - */ - static int -@@ -515,8 +520,14 @@ serve_client(int i) { - * pseudo_server_response. - */ - if (in->type != PSEUDO_MSG_SHUTDOWN) { -- if (in->type == PSEUDO_MSG_FASTOP) -+ if (in->type == PSEUDO_MSG_FASTOP) { - send_response = 0; -+ /* For fastops we reply now to say we got the data */ -+ if ((rc = pseudo_msg_send(clients[i].fd, &server_fastop_reply, 0, NULL)) != 0) { -+ pseudo_debug(PDBGF_SERVER, "failed to send fastop ack to client %d [%d]: %d (%s)\n", -+ i, (int) clients[i].pid, rc, strerror(errno)); -+ } -+ } - /* most messages don't need these, but xattr may */ - response_path = 0; - response_pathlen = -1; diff --git a/meta/recipes-devtools/pseudo/files/glibc238.patch b/meta/recipes-devtools/pseudo/files/glibc238.patch new file mode 100644 index 0000000000..da4b8caee3 --- /dev/null +++ b/meta/recipes-devtools/pseudo/files/glibc238.patch @@ -0,0 +1,59 @@ +glibc 2.38 would include __isoc23_strtol and similar symbols. This is trggerd by +_GNU_SOURCE but we have to set that for other definitions. Therefore play with defines +to turn this off within pseudo_wrappers.c. Elsewhere we can switch to _DEFAULT_SOURCE +rather than _GNU_SOURCE. + +Upstream-Status: Pending + +Index: git/pseudo_wrappers.c +=================================================================== +--- git.orig/pseudo_wrappers.c ++++ git/pseudo_wrappers.c +@@ -6,6 +6,15 @@ + * SPDX-License-Identifier: LGPL-2.1-only + * + */ ++/* glibc 2.38 would include __isoc23_strtol and similar symbols. This is trggerd by ++ * _GNU_SOURCE but we have to set that for other definitions. Therefore play with defines ++ * to turn this off. ++ */ ++#include <features.h> ++#undef __GLIBC_USE_ISOC2X ++#undef __GLIBC_USE_C2X_STRTOL ++#define __GLIBC_USE_C2X_STRTOL 0 ++ + #include <assert.h> + #include <stdlib.h> + #include <limits.h> +Index: git/pseudo_util.c +=================================================================== +--- git.orig/pseudo_util.c ++++ git/pseudo_util.c +@@ -8,6 +8,14 @@ + */ + /* we need access to RTLD_NEXT for a horrible workaround */ + #define _GNU_SOURCE ++/* glibc 2.38 would include __isoc23_strtol and similar symbols. This is trggerd by ++ * _GNU_SOURCE but we have to set that for other definitions. Therefore play with defines ++ * to turn this off. ++ */ ++#include <features.h> ++#undef __GLIBC_USE_ISOC2X ++#undef __GLIBC_USE_C2X_STRTOL ++#define __GLIBC_USE_C2X_STRTOL 0 + + #include <ctype.h> + #include <errno.h> +Index: git/pseudo_client.c +=================================================================== +--- git.orig/pseudo_client.c ++++ git/pseudo_client.c +@@ -6,7 +6,7 @@ + * SPDX-License-Identifier: LGPL-2.1-only + * + */ +-#define _GNU_SOURCE ++#define _DEFAULT_SOURCE + + #include <stdio.h> + #include <signal.h> diff --git a/meta/recipes-devtools/pseudo/files/moreretries.patch b/meta/recipes-devtools/pseudo/files/moreretries.patch deleted file mode 100644 index adea2665b0..0000000000 --- a/meta/recipes-devtools/pseudo/files/moreretries.patch +++ /dev/null @@ -1,19 +0,0 @@ -Increase the number of retries in pseudo due to occasional slow -server shutdowns. - -Upstream-Status: Pending -RP 2016/2/28 - -Index: git/pseudo_client.c -=================================================================== ---- git.orig/pseudo_client.c -+++ git/pseudo_client.c -@@ -1282,7 +1282,7 @@ pseudo_client_setup(void) { - } - } - --#define PSEUDO_RETRIES 20 -+#define PSEUDO_RETRIES 250 - static pseudo_msg_t * - pseudo_client_request(pseudo_msg_t *msg, size_t len, const char *path) { - pseudo_msg_t *response = 0; diff --git a/meta/recipes-devtools/pseudo/files/older-glibc-symbols.patch b/meta/recipes-devtools/pseudo/files/older-glibc-symbols.patch new file mode 100644 index 0000000000..c453b5f735 --- /dev/null +++ b/meta/recipes-devtools/pseudo/files/older-glibc-symbols.patch @@ -0,0 +1,57 @@ +If we link against a newer glibc 2.34 and then try and our LD_PRELOAD is run against a +binary on a host with an older libc, we see symbol errors since in glibc 2.34, pthread +and dl are merged into libc itself. + +We need to use the older form of linking so use glibc binaries from an older release +to force this. We only use minimal symbols from these anyway. + +pthread_atfork is problematic, particularly on arm so use the internal glibc routine +it maps too. This was always present in the main libc from 2.3.2 onwards. + +Yes this is horrible. Better solutions welcome. + +There is more info in the bug: [YOCTO #14521] + +Upstream-Status: Inappropriate [this patch is native and nativesdk] +Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> + +Tweak library search order, make prebuilt lib ahead of recipe lib +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> +--- + Makefile.in | 2 +- + pseudo_wrappers.c | 5 ++++- + 2 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/Makefile.in b/Makefile.in +--- a/Makefile.in ++++ b/Makefile.in +@@ -120,7 +120,7 @@ $(PSEUDODB): pseudodb.o $(SHOBJS) $(DBOBJS) pseudo_ipc.o | $(BIN) + libpseudo: $(LIBPSEUDO) + + $(LIBPSEUDO): $(WRAPOBJS) pseudo_client.o pseudo_ipc.o $(SHOBJS) | $(LIB) +- $(CC) $(CFLAGS) $(CFLAGS_PSEUDO) -shared -o $(LIBPSEUDO) \ ++ $(CC) $(CFLAGS) -Lprebuilt/$(shell uname -m)-linux/lib/ $(CFLAGS_PSEUDO) -shared -o $(LIBPSEUDO) \ + pseudo_client.o pseudo_ipc.o \ + $(WRAPOBJS) $(SHOBJS) $(LDFLAGS) $(CLIENT_LDFLAGS) + +diff --git a/pseudo_wrappers.c b/pseudo_wrappers.c +--- a/pseudo_wrappers.c ++++ b/pseudo_wrappers.c +@@ -100,10 +100,13 @@ static void libpseudo_atfork_child(void) + pseudo_mutex_holder = 0; + } + ++extern void *__dso_handle; ++extern int __register_atfork (void (*) (void), void (*) (void), void (*) (void), void *); ++ + static void + _libpseudo_init(void) { + if (!_libpseudo_initted) +- pthread_atfork(NULL, NULL, libpseudo_atfork_child); ++ __register_atfork (NULL, NULL, libpseudo_atfork_child, &__dso_handle == NULL ? NULL : __dso_handle); + + pseudo_getlock(); + pseudo_antimagic(); +-- +2.27.0 + diff --git a/meta/recipes-devtools/pseudo/files/toomanyfiles.patch b/meta/recipes-devtools/pseudo/files/toomanyfiles.patch deleted file mode 100644 index b085a4505d..0000000000 --- a/meta/recipes-devtools/pseudo/files/toomanyfiles.patch +++ /dev/null @@ -1,59 +0,0 @@ -Currently if we max out the maximum number of files, pseudo can deadlock, unable to -accept new connections yet unable to move forward and unblock the other processes -waiting either. - -Rather than hang, when this happens, close out inactive connections, allowing us -to accept the new ones. The disconnected clients will simply reconnect. There is -a small risk of data loss here sadly but its better than hanging. - -RP -2017/4/25 - -Upstream-Status: Submitted [Peter is aware of the issue] - -Index: pseudo-1.8.2/pseudo_server.c -=================================================================== ---- pseudo-1.8.2.orig/pseudo_server.c -+++ pseudo-1.8.2/pseudo_server.c -@@ -581,6 +581,7 @@ pseudo_server_loop(void) { - int rc; - int fd; - int loop_timeout = pseudo_server_timeout; -+ int hitmaxfiles; - - clients = malloc(16 * sizeof(*clients)); - -@@ -597,6 +598,7 @@ pseudo_server_loop(void) { - active_clients = 1; - max_clients = 16; - highest_client = 0; -+ hitmaxfiles = 0; - - pseudo_debug(PDBGF_SERVER, "server loop started.\n"); - if (listen_fd < 0) { -@@ -663,10 +665,15 @@ pseudo_server_loop(void) { - message_time.tv_usec -= 1000000; - ++message_time.tv_sec; - } -+ } else if (hitmaxfiles) { -+ /* Only close one per loop iteration in the interests of caution */ -+ close_client(i); -+ hitmaxfiles = 0; - } - if (die_forcefully) - break; - } -+ hitmaxfiles = 0; - if (!die_forcefully && - (FD_ISSET(clients[0].fd, &events) || - FD_ISSET(clients[0].fd, &reads))) { -@@ -688,6 +698,9 @@ pseudo_server_loop(void) { - */ - pseudo_server_timeout = DEFAULT_PSEUDO_SERVER_TIMEOUT; - die_peacefully = 0; -+ } else if (errno == EMFILE) { -+ hitmaxfiles = 1; -+ pseudo_debug(PDBGF_SERVER, "Hit max open files, dropping a client.\n"); - } - } - pseudo_debug(PDBGF_SERVER, "server loop complete [%d clients left]\n", active_clients); |