To allow to run the interpreter itself add a new ELF branding type.
Allow Linux ABI to run ELF interpreter. MFC after: 3 days
This commit is contained in:
parent
fb6bf8bba9
commit
5f56da1891
@ -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[] = {
|
||||
|
@ -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[] = {
|
||||
|
@ -261,6 +261,8 @@ __elfN(get_brandinfo)(struct image_params *imgp, const char *interp,
|
||||
{
|
||||
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_params *imgp, const char *interp,
|
||||
}
|
||||
}
|
||||
|
||||
/* 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];
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user