summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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));
}
}