Add a flag BI_BRAND_ONLY_STATIC to specify that the brand only

matches static binaries.

Interpretation of the 'static' there is that the binary must not
specify an interpreter.  In particular, shared objects are matched by
the brand if BI_CAN_EXEC_DYN is also set.

This improves precision of the brand matching, which should eliminate
surprises due to brand ordering.

Revert r315701.

Discussed with and tested by:	ed (previous version)
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2017-03-22 22:23:01 +00:00
parent 7aab7a80e2
commit 1438fe3cf2
7 changed files with 17 additions and 10 deletions

View File

@ -228,5 +228,5 @@ Elf32_Brandinfo cloudabi32_brand = {
.machine = EM_386,
.sysvec = &cloudabi32_elf_sysvec,
.compat_3_brand = "CloudABI",
.interp_path = "/nonexistent",
.flags = BI_BRAND_NOTE_ONLY_STATIC,
};

View File

@ -212,7 +212,6 @@ Elf64_Brandinfo cloudabi64_brand = {
.brand = ELFOSABI_CLOUDABI,
.machine = EM_X86_64,
.sysvec = &cloudabi64_elf_sysvec,
.flags = BI_CAN_EXEC_DYN,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE_ONLY_STATIC,
.compat_3_brand = "CloudABI",
.interp_path = "/nonexistent",
};

View File

@ -190,5 +190,5 @@ Elf32_Brandinfo cloudabi32_brand = {
.machine = EM_ARM,
.sysvec = &cloudabi32_elf_sysvec,
.compat_3_brand = "CloudABI",
.interp_path = "/nonexistent",
.flags = BI_BRAND_NOTE_ONLY_STATIC,
};

View File

@ -181,7 +181,6 @@ Elf64_Brandinfo cloudabi64_brand = {
.brand = ELFOSABI_CLOUDABI,
.machine = EM_AARCH64,
.sysvec = &cloudabi64_elf_sysvec,
.flags = BI_CAN_EXEC_DYN,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE_ONLY_STATIC,
.compat_3_brand = "CloudABI",
.interp_path = "/nonexistent",
};

View File

@ -201,5 +201,5 @@ Elf32_Brandinfo cloudabi32_brand = {
.machine = EM_386,
.sysvec = &cloudabi32_elf_sysvec,
.compat_3_brand = "CloudABI",
.interp_path = "/nonexistent",
.flags = BI_BRAND_NOTE_ONLY_STATIC,
};

View File

@ -273,6 +273,9 @@ __elfN(get_brandinfo)(struct image_params *imgp, const char *interp,
bi = elf_brand_list[i];
if (bi == NULL)
continue;
if (interp != NULL &&
(bi->flags & BI_BRAND_NOTE_ONLY_STATIC) != 0)
continue;
if (hdr->e_machine == bi->machine && (bi->flags &
(BI_BRAND_NOTE|BI_BRAND_NOTE_MANDATORY)) != 0) {
ret = __elfN(check_note)(imgp, bi->brand_note, osrel);
@ -305,7 +308,9 @@ __elfN(get_brandinfo)(struct image_params *imgp, const char *interp,
/* If the executable has a brand, search for it in the brand list. */
for (i = 0; i < MAX_BRANDS; i++) {
bi = elf_brand_list[i];
if (bi == NULL || bi->flags & BI_BRAND_NOTE_MANDATORY)
if (bi == NULL || (bi->flags & BI_BRAND_NOTE_MANDATORY) != 0 ||
(interp != NULL && (bi->flags &
BI_BRAND_NOTE_ONLY_STATIC) != 0))
continue;
if (hdr->e_machine == bi->machine &&
(hdr->e_ident[EI_OSABI] == bi->brand ||
@ -351,7 +356,8 @@ __elfN(get_brandinfo)(struct image_params *imgp, const char *interp,
if (interp != NULL) {
for (i = 0; i < MAX_BRANDS; i++) {
bi = elf_brand_list[i];
if (bi == NULL || bi->flags & BI_BRAND_NOTE_MANDATORY)
if (bi == NULL || (bi->flags & (BI_BRAND_NOTE_MANDATORY |
BI_BRAND_NOTE_ONLY_STATIC)) != 0)
continue;
if (hdr->e_machine == bi->machine &&
/* ELF image p_filesz includes terminating zero */
@ -365,7 +371,9 @@ __elfN(get_brandinfo)(struct image_params *imgp, const char *interp,
/* Lacking a recognized interpreter, try the default brand */
for (i = 0; i < MAX_BRANDS; i++) {
bi = elf_brand_list[i];
if (bi == NULL || bi->flags & BI_BRAND_NOTE_MANDATORY)
if (bi == NULL || (bi->flags & BI_BRAND_NOTE_MANDATORY) != 0 ||
(interp != NULL && (bi->flags &
BI_BRAND_NOTE_ONLY_STATIC) != 0))
continue;
if (hdr->e_machine == bi->machine &&
__elfN(fallback_brand) == bi->brand)

View File

@ -81,6 +81,7 @@ typedef struct {
#define BI_CAN_EXEC_DYN 0x0001
#define BI_BRAND_NOTE 0x0002 /* May have note.ABI-tag section. */
#define BI_BRAND_NOTE_MANDATORY 0x0004 /* Must have note.ABI-tag section. */
#define BI_BRAND_NOTE_ONLY_STATIC 0x0008
} __ElfN(Brandinfo);
__ElfType(Auxargs);