changeset 13867:5190033d0d57

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>
author Richard Lowe <richlowe@richlowe.net>
date Tue, 23 Oct 2012 14:03:05 -0400
parents 040f4b0699ee
children cba64774a360
files usr/src/cmd/file/elf_read.c
diffstat 1 files changed, 23 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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));
 			}
 		}