@ -3199,16 +3199,17 @@ static bool parse_elf_properties(int image_fd,
On return : INFO values will be filled in , as necessary or available . */
static void load_elf_image ( const char * image_name , int image_fd ,
struct image_info * info , char * * pinterp_name ,
struct image_info * info , struct elfhdr * ehdr ,
char * * pinterp_name ,
char bprm_buf [ BPRM_BUF_SIZE ] )
{
struct elfhdr * ehdr = ( struct elfhdr * ) bprm_buf ;
struct elf_phdr * phdr ;
abi_ulong load_addr , load_bias , loaddr , hiaddr , error ;
int i , retval , prot_exec ;
Error * err = NULL ;
/* First of all, some simple consistency checks */
memcpy ( ehdr , bprm_buf , sizeof ( * ehdr ) ) ;
if ( ! elf_check_ident ( ehdr ) ) {
error_setg ( & err , " Invalid ELF image for this architecture " ) ;
goto exit_errmsg ;
@ -3523,6 +3524,7 @@ static void load_elf_image(const char *image_name, int image_fd,
static void load_elf_interp ( const char * filename , struct image_info * info ,
char bprm_buf [ BPRM_BUF_SIZE ] )
{
struct elfhdr ehdr ;
int fd , retval ;
Error * err = NULL ;
@ -3544,7 +3546,7 @@ static void load_elf_interp(const char *filename, struct image_info *info,
memset ( bprm_buf + retval , 0 , BPRM_BUF_SIZE - retval ) ;
}
load_elf_image ( filename , fd , info , NULL , bprm_buf ) ;
load_elf_image ( filename , fd , info , & ehdr , NULL , bprm_buf ) ;
}
static int symfind ( const void * s0 , const void * s1 )
@ -3737,8 +3739,14 @@ uint32_t get_elf_eflags(int fd)
int load_elf_binary ( struct linux_binprm * bprm , struct image_info * info )
{
/*
* We need a copy of the elf header for passing to create_elf_tables .
* We will have overwritten the original when we re - use bprm - > buf
* while loading the interpreter . Allocate the storage for this now
* and let elf_load_image do any swapping that may be required .
*/
struct elfhdr ehdr ;
struct image_info interp_info ;
struct elfhdr elf_ex ;
char * elf_interpreter = NULL ;
char * scratch ;
@ -3748,12 +3756,7 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
# endif
load_elf_image ( bprm - > filename , bprm - > fd , info ,
& elf_interpreter , bprm - > buf ) ;
/* ??? We need a copy of the elf header for passing to create_elf_tables.
If we do nothing , we ' ll have overwritten this when we re - use bprm - > buf
when we load the interpreter . */
elf_ex = * ( struct elfhdr * ) bprm - > buf ;
& ehdr , & elf_interpreter , bprm - > buf ) ;
/* Do this so that we can load the interpreter, if need be. We will
change some of these later */
@ -3840,7 +3843,7 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
target_mprotect ( tramp_page , TARGET_PAGE_SIZE , PROT_READ | PROT_EXEC ) ;
}
bprm - > p = create_elf_tables ( bprm - > p , bprm - > argc , bprm - > envc , & elf_ex ,
bprm - > p = create_elf_tables ( bprm - > p , bprm - > argc , bprm - > envc , & ehdr ,
info , ( elf_interpreter ? & interp_info : NULL ) ) ;
info - > start_stack = bprm - > p ;