aboutsummaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2019-02-03 11:41:43 +0000
committerDimitry Andric <dim@FreeBSD.org>2019-02-03 11:41:43 +0000
commitc2c227a53646ba18d440c4376b41d8cb94ed0cd7 (patch)
tree3b751f7d03bf01a20e27cbde113fecbf16a7a011 /usr.bin
parent7e565c552a5d3ab1745f5d37c61c51069508f124 (diff)
parent3ca1c423aa157ebf21382543b03d84a64af38e47 (diff)
Notes
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/elfdump/elfdump.c26
-rw-r--r--usr.bin/shar/shar.14
-rwxr-xr-xusr.bin/xinstall/tests/install_test.sh24
-rw-r--r--usr.bin/xinstall/xinstall.c15
4 files changed, 60 insertions, 9 deletions
diff --git a/usr.bin/elfdump/elfdump.c b/usr.bin/elfdump/elfdump.c
index aadf1e84088d..2bdf98830088 100644
--- a/usr.bin/elfdump/elfdump.c
+++ b/usr.bin/elfdump/elfdump.c
@@ -317,10 +317,19 @@ static const char *p_flags[] = {
"PF_X|PF_W|PF_R"
};
+#define NT_ELEM(x) [x] = #x,
+static const char *nt_types[] = {
+ "",
+ NT_ELEM(NT_FREEBSD_ABI_TAG)
+ NT_ELEM(NT_FREEBSD_NOINIT_TAG)
+ NT_ELEM(NT_FREEBSD_ARCH_TAG)
+ NT_ELEM(NT_FREEBSD_FEATURE_CTL)
+};
+
/* http://www.sco.com/developers/gabi/latest/ch4.sheader.html#sh_type */
static const char *
sh_types(uint64_t machine, uint64_t sht) {
- static char unknown_buf[64];
+ static char unknown_buf[64];
if (sht < 0x60000000) {
switch (sht) {
@@ -1061,19 +1070,26 @@ elf_print_note(Elf32_Ehdr *e, void *sh)
u_int32_t namesz;
u_int32_t descsz;
u_int32_t desc;
+ u_int32_t type;
char *n, *s;
+ const char *nt_type;
offset = elf_get_off(e, sh, SH_OFFSET);
size = elf_get_size(e, sh, SH_SIZE);
name = elf_get_word(e, sh, SH_NAME);
n = (char *)e + offset;
fprintf(out, "\nnote (%s):\n", shstrtab + name);
- while (n < ((char *)e + offset + size)) {
+ while (n < ((char *)e + offset + size)) {
namesz = elf_get_word(e, n, N_NAMESZ);
descsz = elf_get_word(e, n, N_DESCSZ);
- s = n + sizeof(Elf_Note);
- desc = elf_get_word(e, n + sizeof(Elf_Note) + namesz, 0);
- fprintf(out, "\t%s %d\n", s, desc);
+ type = elf_get_word(e, n, N_TYPE);
+ if (type < nitems(nt_types) && nt_types[type] != NULL)
+ nt_type = nt_types[type];
+ else
+ nt_type = "Unknown type";
+ s = n + sizeof(Elf_Note);
+ desc = elf_get_word(e, n + sizeof(Elf_Note) + namesz, 0);
+ fprintf(out, "\t%s %d (%s)\n", s, desc, nt_type);
n += sizeof(Elf_Note) + namesz + descsz;
}
}
diff --git a/usr.bin/shar/shar.1 b/usr.bin/shar/shar.1
index 432ae6fb86bc..c3153821250c 100644
--- a/usr.bin/shar/shar.1
+++ b/usr.bin/shar/shar.1
@@ -28,7 +28,7 @@
.\" @(#)shar.1 8.1 (Berkeley) 6/6/93
.\" $FreeBSD$
.\"
-.Dd June 6, 1993
+.Dd January 31, 2019
.Dt SHAR 1
.Os
.Sh NAME
@@ -103,5 +103,5 @@ Archives produced using this implementation of
.Nm
may be easily examined with the command:
.Bd -literal -offset indent
-egrep -v '^[X#]' shar.file
+egrep -av '^[X#]' shar.file
.Ed
diff --git a/usr.bin/xinstall/tests/install_test.sh b/usr.bin/xinstall/tests/install_test.sh
index 4332f9b8268c..92044f34c20b 100755
--- a/usr.bin/xinstall/tests/install_test.sh
+++ b/usr.bin/xinstall/tests/install_test.sh
@@ -377,6 +377,29 @@ mkdir_simple_body() {
atf_check install -d dir1/dir2/dir3
}
+atf_test_case symbolic_link_relative_absolute_common
+symbolic_link_relative_absolute_common_head() {
+ atf_set "descr" "Verify -l rs with absolute paths having common components"
+}
+symbolic_link_relative_absolute_common_body() {
+ filename=foo.so
+ src_path=lib
+ src_path_prefixed=$PWD/$src_path
+ dest_path=$PWD/libexec/
+ src_file=$src_path_prefixed/$filename
+ dest_file=$dest_path/$filename
+
+ atf_check mkdir $src_path_prefixed $dest_path
+ atf_check touch $src_file
+ atf_check install -l sr $src_file $dest_path
+
+ dest_path_relative=$(readlink $dest_file)
+ src_path_relative="../lib/$filename"
+ if [ "$src_path_relative" != "$dest_path_relative" ]; then
+ atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')"
+ fi
+}
+
atf_init_test_cases() {
atf_add_test_case copy_to_nonexistent
atf_add_test_case copy_to_nonexistent_safe
@@ -415,5 +438,6 @@ atf_init_test_cases() {
atf_add_test_case symbolic_link_relative_absolute_source_and_dest1
atf_add_test_case symbolic_link_relative_absolute_source_and_dest1_double_slash
atf_add_test_case symbolic_link_relative_absolute_source_and_dest2
+ atf_add_test_case symbolic_link_relative_absolute_common
atf_add_test_case mkdir_simple
}
diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c
index 880766b34623..d9aca00d8efc 100644
--- a/usr.bin/xinstall/xinstall.c
+++ b/usr.bin/xinstall/xinstall.c
@@ -673,7 +673,7 @@ makelink(const char *from_name, const char *to_name,
}
if (dolink & LN_RELATIVE) {
- char *to_name_copy, *cp, *d, *s;
+ char *to_name_copy, *cp, *d, *ld, *ls, *s;
if (*from_name != '/') {
/* this is already a relative link */
@@ -709,8 +709,19 @@ makelink(const char *from_name, const char *to_name,
free(to_name_copy);
/* Trim common path components. */
- for (s = src, d = dst; *s == *d; s++, d++)
+ ls = ld = NULL;
+ for (s = src, d = dst; *s == *d; ls = s, ld = d, s++, d++)
continue;
+ /*
+ * If we didn't end after a directory separator, then we've
+ * falsely matched the last component. For example, if one
+ * invoked install -lrs /lib/foo.so /libexec/ then the source
+ * would terminate just after the separator while the
+ * destination would terminate in the middle of 'libexec',
+ * leading to a full directory getting falsely eaten.
+ */
+ if ((ls != NULL && *ls != '/') || (ld != NULL && *ld != '/'))
+ s--, d--;
while (*s != '/')
s--, d--;