--- PRoot-5.1.0/src/execve/enter.c 2014-12-15 15:18:11.000000000 +0100 +++ src/src/execve/enter.c 2016-03-20 12:05:08.013426156 +0100 @@ -454,10 +454,10 @@ } extern unsigned char _binary_loader_exe_start; -extern unsigned char _binary_loader_exe_size; +extern unsigned char _binary_loader_exe_end; extern unsigned char WEAK _binary_loader_m32_exe_start; -extern unsigned char WEAK _binary_loader_m32_exe_size; +extern unsigned char WEAK _binary_loader_m32_exe_end; /** * Extract the built-in loader. This function returns NULL if an @@ -483,11 +483,11 @@ if (wants_32bit_version) { start = (void *) &_binary_loader_m32_exe_start; - size = (size_t) &_binary_loader_m32_exe_size; + size = (size_t) (&_binary_loader_m32_exe_end - &_binary_loader_m32_exe_start); } else { start = (void *) &_binary_loader_exe_start; - size = (size_t) &_binary_loader_exe_size; + size = (size_t) (&_binary_loader_exe_end - &_binary_loader_exe_start); } status2 = write(fd, start, size); @@ -645,8 +645,10 @@ /* An ELF interpreter is supposed to be * standalone. */ - if (tracee->load_info->interp->interp != NULL) - return -EINVAL; + if (tracee->load_info->interp->interp != NULL) { + TALLOC_FREE(tracee->load_info->interp->interp); + // TODO: Print warning? + } } compute_load_addresses(tracee);