summaryrefslogtreecommitdiff
path: root/usr/src/cmd/file/elf_read.c
diff options
context:
space:
mode:
authorRichard Lowe <richlowe@richlowe.net>2012-10-23 14:03:05 -0400
committerRichard Lowe <richlowe@richlowe.net>2012-10-25 15:02:51 -0400
commit3d6a6d03a2b1d567b03fb49347aee6b5223261cb (patch)
tree02779a74801bf92f9035ff0782f056782c06b076 /usr/src/cmd/file/elf_read.c
parent1724dc7b89ff9c4d1006fdb79d20a4102d226def (diff)
downloadillumos-joyent-3d6a6d03a2b1d567b03fb49347aee6b5223261cb.tar.gz
3299 file should only care about object capabilities
3300 file should care about all object capabilities Reviewed by: Robert Mustacchi <rm@joyent.com> Reviewed by: Garrett D'Amore <garrett@damore.org> Approved by: Eric Schrock <eric.schrock@delphix.com>
Diffstat (limited to 'usr/src/cmd/file/elf_read.c')
-rw-r--r--usr/src/cmd/file/elf_read.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/usr/src/cmd/file/elf_read.c b/usr/src/cmd/file/elf_read.c
index 5711ef3a63..7ccf8e2bb3 100644
--- a/usr/src/cmd/file/elf_read.c
+++ b/usr/src/cmd/file/elf_read.c
@@ -30,8 +30,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* ELF files can exceed 2GB in size. A standard 32-bit program
* like 'file' cannot read past 2GB, and will be unable to see
@@ -458,6 +456,8 @@ process_shdr(Elf_Info *EI)
cap_off = shdr->sh_offset;
if (shdr->sh_type == SHT_SUNW_cap) {
+ char capstr[128];
+
if (shdr->sh_size == 0 || shdr->sh_entsize == 0) {
(void) fprintf(stderr, ELF_ERR_ELFCAP1,
File, EI->file);
@@ -477,14 +477,28 @@ process_shdr(Elf_Info *EI)
return (ELF_READ_FAIL);
}
- if (Chdr.c_tag != CA_SUNW_NULL) {
- (void) elfcap_tag_to_str(
- ELFCAP_STYLE_UC, Chdr.c_tag,
- Chdr.c_un.c_val, EI->cap_str,
- sizeof (EI->cap_str),
- ELFCAP_FMT_SNGSPACE, mac);
- }
cap_off += csize;
+
+ /*
+ * Each capatibility group is terminated with
+ * CA_SUNW_NULL. Groups other than the first
+ * represent symbol capabilities, and aren't
+ * interesting here.
+ */
+ if (Chdr.c_tag == CA_SUNW_NULL)
+ break;
+
+ (void) elfcap_tag_to_str(ELFCAP_STYLE_UC,
+ Chdr.c_tag, Chdr.c_un.c_val, capstr,
+ sizeof (capstr), ELFCAP_FMT_SNGSPACE,
+ mac);
+
+ if ((*EI->cap_str != '\0') && (*capstr != '\0'))
+ (void) strlcat(EI->cap_str, " ",
+ sizeof (EI->cap_str));
+
+ (void) strlcat(EI->cap_str, capstr,
+ sizeof (EI->cap_str));
}
}