From owner-svn-src-head@freebsd.org Wed Mar 22 22:23:03 2017 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A25DBD18CD5; Wed, 22 Mar 2017 22:23:03 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 770DB15DB; Wed, 22 Mar 2017 22:23:03 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v2MMN2OI048362; Wed, 22 Mar 2017 22:23:02 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v2MMN1S9048354; Wed, 22 Mar 2017 22:23:01 GMT (envelope-from kib@FreeBSD.org) Message-Id: <201703222223.v2MMN1S9048354@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Wed, 22 Mar 2017 22:23:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r315753 - in head/sys: amd64/cloudabi32 amd64/cloudabi64 arm/cloudabi32 arm64/cloudabi64 i386/cloudabi32 kern sys X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Mar 2017 22:23:03 -0000 Author: kib Date: Wed Mar 22 22:23:01 2017 New Revision: 315753 URL: https://svnweb.freebsd.org/changeset/base/315753 Log: 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 Modified: head/sys/amd64/cloudabi32/cloudabi32_sysvec.c head/sys/amd64/cloudabi64/cloudabi64_sysvec.c head/sys/arm/cloudabi32/cloudabi32_sysvec.c head/sys/arm64/cloudabi64/cloudabi64_sysvec.c head/sys/i386/cloudabi32/cloudabi32_sysvec.c head/sys/kern/imgact_elf.c head/sys/sys/imgact_elf.h Modified: head/sys/amd64/cloudabi32/cloudabi32_sysvec.c ============================================================================== --- head/sys/amd64/cloudabi32/cloudabi32_sysvec.c Wed Mar 22 22:20:47 2017 (r315752) +++ head/sys/amd64/cloudabi32/cloudabi32_sysvec.c Wed Mar 22 22:23:01 2017 (r315753) @@ -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, }; Modified: head/sys/amd64/cloudabi64/cloudabi64_sysvec.c ============================================================================== --- head/sys/amd64/cloudabi64/cloudabi64_sysvec.c Wed Mar 22 22:20:47 2017 (r315752) +++ head/sys/amd64/cloudabi64/cloudabi64_sysvec.c Wed Mar 22 22:23:01 2017 (r315753) @@ -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", }; Modified: head/sys/arm/cloudabi32/cloudabi32_sysvec.c ============================================================================== --- head/sys/arm/cloudabi32/cloudabi32_sysvec.c Wed Mar 22 22:20:47 2017 (r315752) +++ head/sys/arm/cloudabi32/cloudabi32_sysvec.c Wed Mar 22 22:23:01 2017 (r315753) @@ -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, }; Modified: head/sys/arm64/cloudabi64/cloudabi64_sysvec.c ============================================================================== --- head/sys/arm64/cloudabi64/cloudabi64_sysvec.c Wed Mar 22 22:20:47 2017 (r315752) +++ head/sys/arm64/cloudabi64/cloudabi64_sysvec.c Wed Mar 22 22:23:01 2017 (r315753) @@ -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", }; Modified: head/sys/i386/cloudabi32/cloudabi32_sysvec.c ============================================================================== --- head/sys/i386/cloudabi32/cloudabi32_sysvec.c Wed Mar 22 22:20:47 2017 (r315752) +++ head/sys/i386/cloudabi32/cloudabi32_sysvec.c Wed Mar 22 22:23:01 2017 (r315753) @@ -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, }; Modified: head/sys/kern/imgact_elf.c ============================================================================== --- head/sys/kern/imgact_elf.c Wed Mar 22 22:20:47 2017 (r315752) +++ head/sys/kern/imgact_elf.c Wed Mar 22 22:23:01 2017 (r315753) @@ -273,6 +273,9 @@ __elfN(get_brandinfo)(struct image_param 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_param /* 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_param 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_param /* 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) Modified: head/sys/sys/imgact_elf.h ============================================================================== --- head/sys/sys/imgact_elf.h Wed Mar 22 22:20:47 2017 (r315752) +++ head/sys/sys/imgact_elf.h Wed Mar 22 22:23:01 2017 (r315753) @@ -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);