svn commit: r266999 - in stable/10/sys: amd64/linux32 i386/linux kern sys
Dmitry Chagin
dchagin at FreeBSD.org
Tue Jun 3 04:31:44 UTC 2014
Author: dchagin
Date: Tue Jun 3 04:31:42 2014
New Revision: 266999
URL: http://svnweb.freebsd.org/changeset/base/266999
Log:
MFC r266925:
To allow to run the interpreter itself add a new ELF branding type.
Allow Linux ABI to run ELF interpreter.
Modified:
stable/10/sys/amd64/linux32/linux32_sysvec.c
stable/10/sys/i386/linux/linux_sysvec.c
stable/10/sys/kern/imgact_elf.c
stable/10/sys/sys/imgact_elf.h
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- stable/10/sys/amd64/linux32/linux32_sysvec.c Tue Jun 3 04:29:26 2014 (r266998)
+++ stable/10/sys/amd64/linux32/linux32_sysvec.c Tue Jun 3 04:31:42 2014 (r266999)
@@ -1083,7 +1083,7 @@ static Elf32_Brandinfo linux_brand = {
.sysvec = &elf_linux_sysvec,
.interp_newpath = NULL,
.brand_note = &linux32_brandnote,
- .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+ .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE | BI_CAN_EXEC_INTERP
};
static Elf32_Brandinfo linux_glibc2brand = {
@@ -1095,7 +1095,7 @@ static Elf32_Brandinfo linux_glibc2brand
.sysvec = &elf_linux_sysvec,
.interp_newpath = NULL,
.brand_note = &linux32_brandnote,
- .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+ .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE | BI_CAN_EXEC_INTERP
};
Elf32_Brandinfo *linux_brandlist[] = {
Modified: stable/10/sys/i386/linux/linux_sysvec.c
==============================================================================
--- stable/10/sys/i386/linux/linux_sysvec.c Tue Jun 3 04:29:26 2014 (r266998)
+++ stable/10/sys/i386/linux/linux_sysvec.c Tue Jun 3 04:31:42 2014 (r266999)
@@ -1058,7 +1058,7 @@ static Elf32_Brandinfo linux_brand = {
.sysvec = &elf_linux_sysvec,
.interp_newpath = NULL,
.brand_note = &linux_brandnote,
- .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+ .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE | BI_CAN_EXEC_INTERP
};
static Elf32_Brandinfo linux_glibc2brand = {
@@ -1070,7 +1070,7 @@ static Elf32_Brandinfo linux_glibc2brand
.sysvec = &elf_linux_sysvec,
.interp_newpath = NULL,
.brand_note = &linux_brandnote,
- .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+ .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE | BI_CAN_EXEC_INTERP
};
Elf32_Brandinfo *linux_brandlist[] = {
Modified: stable/10/sys/kern/imgact_elf.c
==============================================================================
--- stable/10/sys/kern/imgact_elf.c Tue Jun 3 04:29:26 2014 (r266998)
+++ stable/10/sys/kern/imgact_elf.c Tue Jun 3 04:31:42 2014 (r266999)
@@ -261,6 +261,8 @@ __elfN(get_brandinfo)(struct image_param
{
const Elf_Ehdr *hdr = (const Elf_Ehdr *)imgp->image_header;
Elf_Brandinfo *bi;
+ const char *fname_name, *interp_brand_name;
+ int fname_len, interp_len;
boolean_t ret;
int i;
@@ -311,6 +313,33 @@ __elfN(get_brandinfo)(struct image_param
}
}
+ /* Some ABI allows to run the interpreter itself. */
+ for (i = 0; i < MAX_BRANDS; i++) {
+ bi = elf_brand_list[i];
+ if (bi == NULL || bi->flags & BI_BRAND_NOTE_MANDATORY)
+ continue;
+ if (hdr->e_machine != bi->machine ||
+ (bi->flags & BI_CAN_EXEC_INTERP) == 0)
+ continue;
+ /*
+ * Compare the interpreter name not the path to allow run it
+ * from everywhere.
+ */
+ interp_brand_name = strrchr(bi->interp_path, '/');
+ if (interp_brand_name == NULL)
+ interp_brand_name = bi->interp_path;
+ interp_len = strlen(interp_brand_name);
+ fname_name = strrchr(imgp->args->fname, '/');
+ if (fname_name == NULL)
+ fname_name = imgp->args->fname;
+ fname_len = strlen(fname_name);
+ if (fname_len < interp_len)
+ continue;
+ ret = strncmp(fname_name, interp_brand_name, interp_len);
+ if (ret == 0)
+ return (bi);
+ }
+
/* Lacking a recognized interpreter, try the default brand */
for (i = 0; i < MAX_BRANDS; i++) {
bi = elf_brand_list[i];
Modified: stable/10/sys/sys/imgact_elf.h
==============================================================================
--- stable/10/sys/sys/imgact_elf.h Tue Jun 3 04:29:26 2014 (r266998)
+++ stable/10/sys/sys/imgact_elf.h Tue Jun 3 04:31:42 2014 (r266999)
@@ -77,6 +77,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_CAN_EXEC_INTERP 0x0008 /* Allow to run interpreter itself. */
} __ElfN(Brandinfo);
__ElfType(Auxargs);
More information about the svn-src-stable-10
mailing list