# HG changeset patch # User Richard Lowe # Date 1351015385 14400 # Node ID 5190033d0d57954662e20e1becb9c3c8fd90bb74 # Parent 040f4b0699eede22b35b5e99199e74f6c321bc91 3299 file should only care about object capabilities 3300 file should care about all object capabilities Reviewed by: Robert Mustacchi Reviewed by: Garrett D'Amore Approved by: Eric Schrock diff -r 040f4b0699ee -r 5190033d0d57 usr/src/cmd/file/elf_read.c --- a/usr/src/cmd/file/elf_read.c Thu Oct 25 10:16:36 2012 -0700 +++ b/usr/src/cmd/file/elf_read.c Tue Oct 23 14:03:05 2012 -0400 @@ -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 @@ 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 @@ 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)); } }