Author: dchagin
Date: Tue Jun 17 05:29:18 2014
New Revision: 267563
URL: http://svnweb.freebsd.org/changeset/base/267563

Log:
  Revert r266925 as it can lead to instant panic at fexecve():
  
  To allow to run the interpreter itself add a new ELF branding type.
  
  Pointed out by:       kib, mjg

Modified:
  head/sys/amd64/linux32/linux32_sysvec.c
  head/sys/i386/linux/linux_sysvec.c
  head/sys/kern/imgact_elf.c
  head/sys/sys/imgact_elf.h

Modified: head/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- head/sys/amd64/linux32/linux32_sysvec.c     Tue Jun 17 05:24:45 2014        
(r267562)
+++ head/sys/amd64/linux32/linux32_sysvec.c     Tue Jun 17 05:29:18 2014        
(r267563)
@@ -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 | BI_CAN_EXEC_INTERP
+       .flags          = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 };
 
 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 | BI_CAN_EXEC_INTERP
+       .flags          = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 };
 
 Elf32_Brandinfo *linux_brandlist[] = {

Modified: head/sys/i386/linux/linux_sysvec.c
==============================================================================
--- head/sys/i386/linux/linux_sysvec.c  Tue Jun 17 05:24:45 2014        
(r267562)
+++ head/sys/i386/linux/linux_sysvec.c  Tue Jun 17 05:29:18 2014        
(r267563)
@@ -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 | BI_CAN_EXEC_INTERP 
+       .flags          = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 };
 
 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 | BI_CAN_EXEC_INTERP 
+       .flags          = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 };
 
 Elf32_Brandinfo *linux_brandlist[] = {

Modified: head/sys/kern/imgact_elf.c
==============================================================================
--- head/sys/kern/imgact_elf.c  Tue Jun 17 05:24:45 2014        (r267562)
+++ head/sys/kern/imgact_elf.c  Tue Jun 17 05:29:18 2014        (r267563)
@@ -261,8 +261,6 @@ __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;
 
@@ -313,33 +311,6 @@ __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: head/sys/sys/imgact_elf.h
==============================================================================
--- head/sys/sys/imgact_elf.h   Tue Jun 17 05:24:45 2014        (r267562)
+++ head/sys/sys/imgact_elf.h   Tue Jun 17 05:29:18 2014        (r267563)
@@ -77,7 +77,6 @@ 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);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to