Date: Tue, 3 Jun 2014 04:31:43 +0000 (UTC) From: Dmitry Chagin <dchagin@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org Subject: svn commit: r266999 - in stable/10/sys: amd64/linux32 i386/linux kern sys Message-ID: <201406030431.s534Vh4m030769@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406030431.s534Vh4m030769>