Compare commits

...

3 Commits
0.8.5 ... 0.8.6

Author SHA1 Message Date
Guillem Jover
bbf90ac3cd Release libbsd 0.8.6 2017-07-17 01:01:13 +02:00
Guillem Jover
2a8514d8a5 Fix handling of non-contiguous argv + envp in setproctitle()
The two arrays might not reference contiguous memory, and assuming they
are does break at least now on GNU/Hurd, which contains an unmapped
memory block between the memory used by the two arrays.

Just check that each element is strictly after the previous one, so that
we know there are no unmapped memory blocks inbetween.
2017-07-17 00:58:06 +02:00
Guillem Jover
3b2b7938f7 test: Fix nlist() unit test on IA64 and PowerPC 64-bit ELFv1
At least on IA64 and PowerPC 64-bit ELFv1, the functions are stored in
the .text sections but they are accessed through a function descriptor
stored in a data section, for example for PowerPC 64-bit ELFv1 that
section is called .opd.

We should take this into account when checking the n_type for the
functions we have requested information from nlist().

Rationale-by: James Clarke <jrtc27@jrtc27.com>
2017-06-25 02:10:26 +02:00
3 changed files with 12 additions and 3 deletions

View File

@@ -13,7 +13,7 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])],
LIBBSD_ABI_MAJOR=0
LIBBSD_ABI_MINOR=8
LIBBSD_ABI_PATCH=5
LIBBSD_ABI_PATCH=6
LIBBSD_ABI="$LIBBSD_ABI_MAJOR:$LIBBSD_ABI_MINOR:$LIBBSD_ABI_PATCH"
AC_SUBST([LIBBSD_ABI])

View File

@@ -173,14 +173,14 @@ setproctitle_init(int argc, char *argv[], char *envp[])
end = nul + 1;
for (i = 0; i < argc || (i >= argc && argv[i]); i++) {
if (argv[i] == NULL || argv[i] < end)
if (argv[i] == NULL || argv[i] != end)
continue;
end = argv[i] + strlen(argv[i]) + 1;
}
for (i = 0; envp[i]; i++) {
if (envp[i] < end)
if (envp[i] != end)
continue;
end = envp[i] + strlen(envp[i]) + 1;

View File

@@ -69,8 +69,17 @@ main(int argc, char **argv)
rc = nlist(argv[0], nl);
assert(rc == 0);
#if defined(__ia64__) || (defined(__powerpc64__) && _CALL_ELF == 1)
/* On IA64 and PowerPC 64-bit ELFv1, the functions are stored in
* the .text sections but they are accessed through a function
* descriptor stored in a data section, for example for PowerPC
* 64-bit that section is called .opd. */
assert(nl[0].n_type == (N_DATA | N_EXT));
assert(nl[1].n_type == (N_DATA | N_EXT));
#else
assert(nl[0].n_type == (N_TEXT | N_EXT));
assert(nl[1].n_type == (N_TEXT | N_EXT));
#endif
assert(nl[2].n_type == (N_BSS | N_EXT));
assert(nl[3].n_type == (N_DATA | N_EXT));
assert(nl[4].n_type == (N_DATA));