Print this page
3299 file should only care about object capabilities
3300 file should care about all object capabilities

@@ -28,12 +28,10 @@
 /*
  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * 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
  * the ELF section headers that typically are at the end of the
  * object. The simplest solution to this problem would be to make

@@ -456,10 +454,12 @@
                         continue;
                 }
 
                 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);
                                 return (ELF_READ_FAIL);
                         }

@@ -475,18 +475,32 @@
                                         (void) fprintf(stderr, ELF_ERR_ELFCAP2,
                                             File, EI->file);
                                         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));
                         }
                 }
 
                 /*
                  * Definition time: