Author: jhb
Date: Mon Feb  5 23:27:42 2018
New Revision: 328909
URL: https://svnweb.freebsd.org/changeset/base/328909

Log:
  Always give ELF brands a chance to veto a match.
  
  If a brand provides a header_supported hook, check it when trying to
  find a brand based on a matching interpreter as well as in the final
  loop for the fallback brand. Previously a brand might reject a binary
  via a header_supported hook in one of the earlier loops, but still be
  chosen by one of these later loops.
  
  Reviewed by:  kib
  Obtained from:        CheriBSD
  MFC after:    2 weeks
  Sponsored by: DARPA / AFRL
  Differential Revision:        https://reviews.freebsd.org/D13945

Modified:
  head/sys/kern/imgact_elf.c

Modified: head/sys/kern/imgact_elf.c
==============================================================================
--- head/sys/kern/imgact_elf.c  Mon Feb  5 23:14:20 2018        (r328908)
+++ head/sys/kern/imgact_elf.c  Mon Feb  5 23:27:42 2018        (r328909)
@@ -321,7 +321,7 @@ __elfN(get_brandinfo)(struct image_params *imgp, const
                    strcmp((const char *)&hdr->e_ident[OLD_EI_BRAND],
                    bi->compat_3_brand) == 0))) {
                        /* Looks good, but give brand a chance to veto */
-                       if (!bi->header_supported ||
+                       if (bi->header_supported == NULL ||
                            bi->header_supported(imgp)) {
                                /*
                                 * Again, prefer strictly matching
@@ -369,7 +369,8 @@ __elfN(get_brandinfo)(struct image_params *imgp, const
                            /* ELF image p_filesz includes terminating zero */
                            strlen(bi->interp_path) + 1 == interp_name_len &&
                            strncmp(interp, bi->interp_path, interp_name_len)
-                           == 0)
+                           == 0 && (bi->header_supported == NULL ||
+                           bi->header_supported(imgp)))
                                return (bi);
                }
        }
@@ -381,7 +382,9 @@ __elfN(get_brandinfo)(struct image_params *imgp, const
                    (interp != NULL && (bi->flags & BI_BRAND_ONLY_STATIC) != 0))
                        continue;
                if (hdr->e_machine == bi->machine &&
-                   __elfN(fallback_brand) == bi->brand)
+                   __elfN(fallback_brand) == bi->brand &&
+                   (bi->header_supported == NULL ||
+                   bi->header_supported(imgp)))
                        return (bi);
        }
        return (NULL);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to