summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/pseudo/files
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/pseudo/files')
-rw-r--r--meta/recipes-devtools/pseudo/files/0001-pseudo_has_unload-add-function.patch190
-rw-r--r--meta/recipes-devtools/pseudo/files/fallback-group2
-rw-r--r--meta/recipes-devtools/pseudo/files/fallback-passwd1
-rw-r--r--meta/recipes-devtools/pseudo/files/pseudo-1.5.1-install-directory-mode.patch18
-rw-r--r--meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch264
-rw-r--r--meta/recipes-devtools/pseudo/files/shutdownping.patch53
-rw-r--r--meta/recipes-devtools/pseudo/files/symver.patch26
7 files changed, 554 insertions, 0 deletions
diff --git a/meta/recipes-devtools/pseudo/files/0001-pseudo_has_unload-add-function.patch b/meta/recipes-devtools/pseudo/files/0001-pseudo_has_unload-add-function.patch
new file mode 100644
index 0000000000..b5c81c9d3e
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/0001-pseudo_has_unload-add-function.patch
@@ -0,0 +1,190 @@
1From be97cb958f2934fa398fc8e344b25b84ebd4e90c Mon Sep 17 00:00:00 2001
2From: "Peter A. Bigot" <pab@pabigot.com>
3Date: Sun, 25 Aug 2013 19:22:09 -0500
4Subject: [PATCH] pseudo_has_unload: add function
5
6Various wrappers checked for a non-null pseudo_get_value("PSEUDO_UNLOAD") to
7determine whether the environment should include the pseudo variables. None
8of those checks freed the returned value when it was not null. The new
9check function does.
10
11The new check function also sees whether PSEUDO_UNLOAD was defined in the
12environment that should be used in the wrapped system call. This allows
13pkg_postinst scripts to strip out the LD_PRELOAD setting, for example before
14invoking qemu to execute commands in an environment that does not have
15libpseudo.so.
16
17[YOCTO #4843]
18
19Upstream-Status: Pending
20Signed-off-by: Peter A. Bigot <pab@pabigot.com>
21---
22 ports/common/guts/execv.c | 2 +-
23 ports/common/guts/execve.c | 2 +-
24 ports/common/guts/execvp.c | 2 +-
25 ports/common/guts/fork.c | 2 +-
26 ports/linux/newclone/pseudo_wrappers.c | 2 +-
27 ports/linux/oldclone/pseudo_wrappers.c | 2 +-
28 ports/unix/guts/popen.c | 2 +-
29 ports/unix/guts/system.c | 2 +-
30 pseudo.h | 1 +
31 pseudo_util.c | 27 +++++++++++++++++++++++++++
32 10 files changed, 36 insertions(+), 8 deletions(-)
33
34diff --git a/ports/common/guts/execv.c b/ports/common/guts/execv.c
35index 763e1f9..3e1f820 100644
36--- a/ports/common/guts/execv.c
37+++ b/ports/common/guts/execv.c
38@@ -19,7 +19,7 @@
39 }
40
41 pseudo_setupenv();
42- if (pseudo_get_value("PSEUDO_UNLOAD"))
43+ if (pseudo_has_unload(NULL))
44 pseudo_dropenv();
45
46 /* if exec() fails, we may end up taking signals unexpectedly...
47diff --git a/ports/common/guts/execve.c b/ports/common/guts/execve.c
48index a003657..ff6a44e 100644
49--- a/ports/common/guts/execve.c
50+++ b/ports/common/guts/execve.c
51@@ -20,7 +20,7 @@
52 }
53
54 new_environ = pseudo_setupenvp(envp);
55- if (pseudo_get_value("PSEUDO_UNLOAD"))
56+ if (pseudo_has_unload(new_environ))
57 new_environ = pseudo_dropenvp(new_environ);
58
59 /* if exec() fails, we may end up taking signals unexpectedly...
60diff --git a/ports/common/guts/execvp.c b/ports/common/guts/execvp.c
61index 5e75be7..04253c3 100644
62--- a/ports/common/guts/execvp.c
63+++ b/ports/common/guts/execvp.c
64@@ -20,7 +20,7 @@
65 }
66
67 pseudo_setupenv();
68- if (pseudo_get_value("PSEUDO_UNLOAD"))
69+ if (pseudo_has_unload(NULL))
70 pseudo_dropenv();
71
72 /* if exec() fails, we may end up taking signals unexpectedly...
73diff --git a/ports/common/guts/fork.c b/ports/common/guts/fork.c
74index df8abd7..bebe3b0 100644
75--- a/ports/common/guts/fork.c
76+++ b/ports/common/guts/fork.c
77@@ -12,7 +12,7 @@
78 */
79 if (rc == 0) {
80 pseudo_setupenv();
81- if (!pseudo_get_value("PSEUDO_UNLOAD")) {
82+ if (!pseudo_has_unload(NULL)) {
83 pseudo_reinit_libpseudo();
84 } else {
85 pseudo_dropenv();
86diff --git a/ports/linux/newclone/pseudo_wrappers.c b/ports/linux/newclone/pseudo_wrappers.c
87index 9dbac42..257e8bb 100644
88--- a/ports/linux/newclone/pseudo_wrappers.c
89+++ b/ports/linux/newclone/pseudo_wrappers.c
90@@ -28,7 +28,7 @@ int wrap_clone_child(void *args) {
91
92 if (!(flags & CLONE_VM)) {
93 pseudo_setupenv();
94- if (!pseudo_get_value("PSEUDO_UNLOAD")) {
95+ if (!pseudo_has_unload(NULL)) {
96 pseudo_reinit_libpseudo();
97 } else {
98 pseudo_dropenv();
99diff --git a/ports/linux/oldclone/pseudo_wrappers.c b/ports/linux/oldclone/pseudo_wrappers.c
100index c0ce5dd..598d966 100644
101--- a/ports/linux/oldclone/pseudo_wrappers.c
102+++ b/ports/linux/oldclone/pseudo_wrappers.c
103@@ -22,7 +22,7 @@ int wrap_clone_child(void *args) {
104
105 if (!(flags & CLONE_VM)) {
106 pseudo_setupenv();
107- if (!pseudo_get_value("PSEUDO_UNLOAD")) {
108+ if (!pseudo_has_unload(NULL)) {
109 pseudo_reinit_libpseudo();
110 } else {
111 pseudo_dropenv();
112diff --git a/ports/unix/guts/popen.c b/ports/unix/guts/popen.c
113index 0ca16b0..5d44c0e 100644
114--- a/ports/unix/guts/popen.c
115+++ b/ports/unix/guts/popen.c
116@@ -9,7 +9,7 @@
117 * in ways that avoid our usual enforcement of the environment.
118 */
119 pseudo_setupenv();
120- if (pseudo_get_value("PSEUDO_UNLOAD"))
121+ if (pseudo_has_unload(NULL))
122 pseudo_dropenv();
123
124 rc = real_popen(command, mode);
125diff --git a/ports/unix/guts/system.c b/ports/unix/guts/system.c
126index 028b372..6351592 100644
127--- a/ports/unix/guts/system.c
128+++ b/ports/unix/guts/system.c
129@@ -9,7 +9,7 @@
130 return 1;
131
132 pseudo_setupenv();
133- if (pseudo_get_value("PSEUDO_UNLOAD"))
134+ if (pseudo_has_unload(NULL))
135 pseudo_dropenv();
136
137 rc = real_system(command);
138diff --git a/pseudo.h b/pseudo.h
139index 56760a4..f600793 100644
140--- a/pseudo.h
141+++ b/pseudo.h
142@@ -28,6 +28,7 @@ extern void pseudo_init_client(void);
143 void pseudo_dump_env(char **envp);
144 int pseudo_set_value(const char *key, const char *value);
145 char *pseudo_get_value(const char *key);
146+int pseudo_has_unload(char * const *envp);
147
148 #include "pseudo_tables.h"
149
150diff --git a/pseudo_util.c b/pseudo_util.c
151index 8d0969e..16c70e0 100644
152--- a/pseudo_util.c
153+++ b/pseudo_util.c
154@@ -95,6 +95,33 @@ dump_env(char **envp) {
155 }
156 #endif
157
158+int
159+pseudo_has_unload(char * const *envp) {
160+ static const char unload[] = "PSEUDO_UNLOAD";
161+ static size_t unload_len = strlen(unload);
162+ size_t i = 0;
163+
164+ /* Is it in the caller environment? */
165+ if (NULL != getenv(unload))
166+ return 1;
167+
168+ /* Is it in the environment cache? */
169+ if (pseudo_util_initted == -1)
170+ pseudo_init_util();
171+ while (pseudo_env[i].key && strcmp(pseudo_env[i].key, unload))
172+ ++i;
173+ if (pseudo_env[i].key && pseudo_env[i].value)
174+ return 1;
175+
176+ /* Is it in the operational environment? */
177+ while (envp && *envp) {
178+ if ((!strncmp(*envp, unload, unload_len)) && ('=' == (*envp)[unload_len]))
179+ return 1;
180+ ++envp;
181+ }
182+ return 0;
183+}
184+
185 /* Caller must free memory! */
186 char *
187 pseudo_get_value(const char *key) {
188--
1891.7.9.5
190
diff --git a/meta/recipes-devtools/pseudo/files/fallback-group b/meta/recipes-devtools/pseudo/files/fallback-group
new file mode 100644
index 0000000000..81bf732312
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/fallback-group
@@ -0,0 +1,2 @@
1root:*:0:
2mail:*:8:
diff --git a/meta/recipes-devtools/pseudo/files/fallback-passwd b/meta/recipes-devtools/pseudo/files/fallback-passwd
new file mode 100644
index 0000000000..c1458dc0f6
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/fallback-passwd
@@ -0,0 +1 @@
root::0:0:root:/home/root:/bin/sh
diff --git a/meta/recipes-devtools/pseudo/files/pseudo-1.5.1-install-directory-mode.patch b/meta/recipes-devtools/pseudo/files/pseudo-1.5.1-install-directory-mode.patch
new file mode 100644
index 0000000000..e8eaf13f74
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/pseudo-1.5.1-install-directory-mode.patch
@@ -0,0 +1,18 @@
1Upstream-Status: Backport
2
3when install command sets the created directory mode, pseudo will change
4the mode of the directory to 0700 incorrectly.
5
6Signed-off-by: yanjun.zhu <yanjun.zhu@windriver.com>
7Signed-off-by: Kai Kang <kai.kang@windriver.com>
8
9--- a/ports/unix/guts/mkdirat.c
10+++ b/ports/unix/guts/mkdirat.c
11@@ -25,6 +25,7 @@
12 stat_rc = base_fstatat(dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
13 #endif
14 if (stat_rc != -1) {
15+ buf.st_mode = PSEUDO_DB_MODE(buf.st_mode, mode);
16 pseudo_client_op(OP_MKDIR, 0, -1, dirfd, path, &buf);
17 } else {
18 pseudo_debug(1, "mkdir of %s succeeded, but stat failed: %s\n",
diff --git a/meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch b/meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch
new file mode 100644
index 0000000000..7b1f82d577
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch
@@ -0,0 +1,264 @@
1commit 7e67d082737b3df4788caf85fedd607b3acd9786
2Author: Peter Seebach <peter.seebach@windriver.com>
3Date: Fri May 16 15:53:06 2014 -0500
4
5 permissions updates: improve fchmodat, mask out write bits
6
7 Upstream-Status: Backport of several patches from 1.6 branch,
8 combined.
9
10 Backport from pseudo 1.6 of improvements to fchmodat (handle
11 AT_SYMLINK_NOFOLLOW by rejecting it if the host system does,
12 to make GNU tar happier), also mask out write bits from filesystem
13 modes to avoid security problems.
14
15 Also start tracking umask so we can use the right modes for
16 open, mkdir, and mknod.
17
18 The 1.6 patches are:
19
20 87c53ea58befef48677846693aab445df1850e16
21 3c716e0bab4f0cfe4be84caa9ce5fd5e3f5e2a23
22 c98e4f43b5d6499748a5057134408f4ba4854fb4
23 2f71a021b725c1aa415439209a89327f0b997d02
24 14925786b55202d8147b0af719038e8a23ef73c0
25
26diff --git a/ChangeLog.txt b/ChangeLog.txt
27index 113f675..cc966ce 100644
28--- a/ChangeLog.txt
29+++ b/ChangeLog.txt
30@@ -1,3 +1,18 @@
31+2014-05-27:
32+ * (seebs) start noticing umask, mask it out from open or mkdir
33+ calls rather than relying on underlying open/mkdir to do it.
34+
35+2014-05-16:
36+ * (seebs) fchmodat: don't drop flags, report failures, to improve
37+ compatibility/consistency. Cache the knowledge that
38+ AT_SYMLINK_NOFOLLOW gets ENOTSUP.
39+ * (seebs) mask out group/other write bits in real filesystem to
40+ reduce risks when assembling a rootfs including world-writeable
41+ directories.
42+
43+2014-05-15:
44+ * (seebs) drop flags when calling fchmodat() to appease GNU tar.
45+
46 2013-02-27:
47 * (seebs) Oh, hey, what if I took out my debug messages?
48 * (seebs) update docs a bit to reduce bitrot
49diff --git a/makewrappers b/makewrappers
50index e87cc56..0127766 100755
51--- a/makewrappers
52+++ b/makewrappers
53@@ -204,6 +204,7 @@ class Function:
54 'uid_t': '0',
55 'int': '-1',
56 'long': '-1',
57+ 'mode_t': '0',
58 'ssize_t': '-1'
59 }
60
61diff --git a/ports/darwin/guts/open.c b/ports/darwin/guts/open.c
62index c66cc15..520bb70 100644
63--- a/ports/darwin/guts/open.c
64+++ b/ports/darwin/guts/open.c
65@@ -9,6 +9,9 @@
66 struct stat buf = { };
67 int existed = 1;
68 int save_errno;
69+
70+ /* mask out mode bits appropriately */
71+ mode = mode & ~pseudo_umask;
72 #ifdef PSEUDO_FORCE_ASYNCH
73 flags &= ~O_SYNC;
74 #endif
75diff --git a/ports/linux/guts/__xmknodat.c b/ports/linux/guts/__xmknodat.c
76index 59b4f2f..0888b8a 100644
77--- a/ports/linux/guts/__xmknodat.c
78+++ b/ports/linux/guts/__xmknodat.c
79@@ -9,6 +9,9 @@
80 pseudo_msg_t *msg;
81 struct stat64 buf;
82
83+ /* mask out mode bits appropriately */
84+ mode = mode & ~pseudo_umask;
85+
86 /* we don't use underlying call, so _ver is irrelevant to us */
87 (void) ver;
88
89diff --git a/ports/linux/guts/openat.c b/ports/linux/guts/openat.c
90index 8460073..4053549 100644
91--- a/ports/linux/guts/openat.c
92+++ b/ports/linux/guts/openat.c
93@@ -10,6 +10,9 @@
94 int existed = 1;
95 int save_errno;
96
97+ /* mask out mode bits appropriately */
98+ mode = mode & ~pseudo_umask;
99+
100 #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
101 if (dirfd != AT_FDCWD) {
102 errno = ENOSYS;
103diff --git a/ports/unix/guts/fchmodat.c b/ports/unix/guts/fchmodat.c
104index 59a92ce..69a953c 100644
105--- a/ports/unix/guts/fchmodat.c
106+++ b/ports/unix/guts/fchmodat.c
107@@ -8,6 +8,7 @@
108 */
109 PSEUDO_STATBUF buf;
110 int save_errno = errno;
111+ static int picky_fchmodat = 0;
112
113 #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
114 if (dirfd != AT_FDCWD) {
115@@ -15,6 +16,16 @@
116 return -1;
117 }
118 if (flags & AT_SYMLINK_NOFOLLOW) {
119+ /* Linux, as of this writing, will always reject this.
120+ * GNU tar relies on getting the rejection. To cut down
121+ * on traffic, we check for the failure, and if we saw
122+ * a failure previously, we reject it right away and tell
123+ * the caller to retry.
124+ */
125+ if (picky_fchmodat) {
126+ errno = ENOTSUP;
127+ return -1;
128+ }
129 rc = base_lstat(path, &buf);
130 } else {
131 rc = base_stat(path, &buf);
132@@ -50,13 +61,22 @@
133
134 /* user bits added so "root" can always access files. */
135 #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
136- /* note: if path was a symlink, and AT_NOFOLLOW_SYMLINKS was
137+ /* note: if path was a symlink, and AT_SYMLINK_NOFOLLOW was
138 * specified, we already bailed previously. */
139 real_chmod(path, PSEUDO_FS_MODE(mode, S_ISDIR(buf.st_mode)));
140 #else
141- real_fchmodat(dirfd, path, PSEUDO_FS_MODE(mode, S_ISDIR(buf.st_mode)), flags);
142+ rc = real_fchmodat(dirfd, path, PSEUDO_FS_MODE(mode, S_ISDIR(buf.st_mode)), flags);
143+ /* AT_SYMLINK_NOFOLLOW isn't supported by fchmodat. GNU tar
144+ * tries to use it anyway, figuring it can just retry if that
145+ * fails. So we want to report that *particular* failure instead
146+ * of doing the fallback.
147+ */
148+ if (rc == -1 && errno == ENOTSUP && (flags & AT_SYMLINK_NOFOLLOW)) {
149+ picky_fchmodat = 1;
150+ return -1;
151+ }
152 #endif
153- /* we ignore a failure from underlying fchmod, because pseudo
154+ /* we otherwise ignore failures from underlying fchmod, because pseudo
155 * may believe you are permitted to change modes that the filesystem
156 * doesn't. Note that we also don't need to know whether the
157 * file might be a (pseudo) block device or some such; pseudo
158diff --git a/ports/unix/guts/mkdirat.c b/ports/unix/guts/mkdirat.c
159index e846b70..e0b6af9 100644
160--- a/ports/unix/guts/mkdirat.c
161+++ b/ports/unix/guts/mkdirat.c
162@@ -6,11 +6,14 @@
163 * wrap_mkdirat(int dirfd, const char *path, mode_t mode) {
164 * int rc = -1;
165 */
166+ /* mask out mode bits appropriately */
167+ mode = mode & ~pseudo_umask;
168 #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
169 if (dirfd != AT_FDCWD) {
170 errno = ENOSYS;
171 return -1;
172 }
173+
174 rc = real_mkdir(path, PSEUDO_FS_MODE(mode, 1));
175 #else
176 rc = real_mkdirat(dirfd, path, PSEUDO_FS_MODE(mode, 1));
177diff --git a/ports/unix/guts/mknodat.c b/ports/unix/guts/mknodat.c
178index 6fd5b42..5d8d47c 100644
179--- a/ports/unix/guts/mknodat.c
180+++ b/ports/unix/guts/mknodat.c
181@@ -10,6 +10,9 @@
182 PSEUDO_STATBUF buf;
183 int save_errno = errno;
184
185+ /* mask out mode bits appropriately */
186+ mode = mode & ~pseudo_umask;
187+
188 #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
189 if (dirfd != AT_FDCWD) {
190 errno = ENOSYS;
191diff --git a/ports/unix/guts/umask.c b/ports/unix/guts/umask.c
192new file mode 100644
193index 0000000..6b060d3
194--- /dev/null
195+++ b/ports/unix/guts/umask.c
196@@ -0,0 +1,14 @@
197+/*
198+ * Copyright (c) 2014 Wind River Systems; see
199+ * guts/COPYRIGHT for information.
200+ *
201+ * mode_t umask(mode_t mask)
202+ * mode_t rc = 0;
203+ */
204+
205+ pseudo_umask = mask;
206+ rc = real_umask(mask);
207+
208+/* return rc;
209+ * }
210+ */
211diff --git a/ports/unix/wrapfuncs.in b/ports/unix/wrapfuncs.in
212index 8460a65..e0e9739 100644
213--- a/ports/unix/wrapfuncs.in
214+++ b/ports/unix/wrapfuncs.in
215@@ -67,3 +67,4 @@ void sync(void); /* async_skip= */
216 int syncfs(int fd); /* async_skip=0 */
217 int sync_file_range(int fd, off64_t offset, off64_t nbytes, unsigned int flags); /* async_skip=0 */
218 int msync(void *addr, size_t length, int flags); /* async_skip=0 */
219+mode_t umask(mode_t mask);
220diff --git a/pseudo_client.c b/pseudo_client.c
221index b6d11a6..535c810 100644
222--- a/pseudo_client.c
223+++ b/pseudo_client.c
224@@ -71,6 +71,8 @@ int pseudo_disabled = 0;
225 int pseudo_allow_fsync = 0;
226 static int pseudo_local_only = 0;
227
228+int pseudo_umask = 022;
229+
230 static char **fd_paths = NULL;
231 static int nfds = 0;
232 static int messages = 0;
233@@ -219,6 +221,9 @@ pseudo_init_client(void) {
234 if (!pseudo_disabled && !pseudo_inited) {
235 char *pseudo_path = 0;
236
237+ pseudo_umask = umask(022);
238+ umask(pseudo_umask);
239+
240 pseudo_path = pseudo_prefix_path(NULL);
241 if (pseudo_prefix_dir_fd == -1) {
242 if (pseudo_path) {
243diff --git a/pseudo_client.h b/pseudo_client.h
244index f36a772..5bf820e 100644
245--- a/pseudo_client.h
246+++ b/pseudo_client.h
247@@ -72,6 +72,8 @@ extern char *pseudo_passwd;
248 extern size_t pseudo_chroot_len;
249 extern int pseudo_nosymlinkexp;
250
251+extern int pseudo_umask;
252+
253 /* Root can read and write files, and enter directories which have no
254 * read, write, or execute permissions. (But can't execute files without
255 * execute permissions!)
256@@ -85,6 +87,6 @@ extern int pseudo_nosymlinkexp;
257 * None of this will behave very sensibly if umask has 0700 bits in it;
258 * this is a known limitation.
259 */
260-#define PSEUDO_FS_MODE(mode, isdir) ((mode) | S_IRUSR | S_IWUSR | ((isdir) ? S_IXUSR : 0))
261-#define PSEUDO_DB_MODE(fs_mode, user_mode) (((fs_mode) & ~0700) | ((user_mode & 0700)))
262+#define PSEUDO_FS_MODE(mode, isdir) (((mode) | S_IRUSR | S_IWUSR | ((isdir) ? S_IXUSR : 0)) & ~(S_IWGRP | S_IWOTH))
263+#define PSEUDO_DB_MODE(fs_mode, user_mode) (((fs_mode) & ~0722) | ((user_mode & 0722)))
264
diff --git a/meta/recipes-devtools/pseudo/files/shutdownping.patch b/meta/recipes-devtools/pseudo/files/shutdownping.patch
new file mode 100644
index 0000000000..8af8e0b594
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/shutdownping.patch
@@ -0,0 +1,53 @@
1There is a potential issue with the fastop code in pseudo since a process may
2exit and allow some other function to run before the server has processed
3the commands run by the process. Issues have been see with unpredictable
4file permissions.
5
6To avoid this, we ping the server before exitting which guarantees it has
7processed the current command queue.
8
9Debugged-by: RP
10Fix written by peter.seebach@windriver.com
11
12Upstream-Status: Submitted
13
14[YOCTO #5132]
15
16diff --git a/pseudo_client.c b/pseudo_client.c
17index f58ce4c..20943b6 100644
18--- a/pseudo_client.c
19+++ b/pseudo_client.c
20@@ -75,6 +75,9 @@ static int nfds = 0;
21 static int messages = 0;
22 static struct timeval message_time = { .tv_sec = 0 };
23 static int pseudo_inited = 0;
24+
25+static int sent_messages = 0;
26+
27 int pseudo_nosymlinkexp = 0;
28
29 /* note: these are int, not uid_t/gid_t, so I can use 'em with scanf */
30@@ -711,6 +714,11 @@ client_ping(void) {
31 return 0;
32 }
33
34+static void
35+void_client_ping(void) {
36+ client_ping();
37+}
38+
39 int
40 pseudo_fd(int fd, int how) {
41 int newfd;
42@@ -1043,6 +1051,11 @@ pseudo_client_op(pseudo_op_t op, int access, int fd, int dirfd, const char *path
43 /* disable wrappers */
44 pseudo_antimagic();
45
46+ if (!sent_messages) {
47+ sent_messages = 1;
48+ atexit(void_client_ping);
49+ }
50+
51 if (op == OP_RENAME) {
52 va_list ap;
53 va_start(ap, buf);
diff --git a/meta/recipes-devtools/pseudo/files/symver.patch b/meta/recipes-devtools/pseudo/files/symver.patch
new file mode 100644
index 0000000000..8d1b377ec0
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/symver.patch
@@ -0,0 +1,26 @@
1When running as pseudo-nativesdk, we might need to run host binaries
2linked against the host libc. Having a 2.14 libc dependency from memcpy is
3problematic so instruct the linker to use older symbols.
4
5Upstream-Status: Pending
6
7RP 2012/4/22
8
9Index: pseudo-1.3/pseudo.h
10===================================================================
11--- pseudo-1.3.orig/pseudo.h 2012-04-22 12:17:59.078909060 +0000
12+++ pseudo-1.3/pseudo.h 2012-04-22 12:32:42.954888587 +0000
13@@ -29,6 +29,13 @@
14 int pseudo_set_value(const char *key, const char *value);
15 char *pseudo_get_value(const char *key);
16
17+#ifdef __amd64__
18+#define GLIBC_COMPAT_SYMBOL(SYM) __asm__(".symver " #SYM "," #SYM "@GLIBC_2.2.5")
19+#else
20+#define GLIBC_COMPAT_SYMBOL(SYM) __asm__(".symver " #SYM "," #SYM "@GLIBC_2.0")
21+#endif
22+GLIBC_COMPAT_SYMBOL(memcpy);
23+
24 #include "pseudo_tables.h"
25
26 extern void pseudo_debug_verbose(void);