execve(): support for ETXTBSY via a new ioctl() call to test in kernel space with open_exec()
This commit is contained in:
@ -42,6 +42,8 @@
|
|||||||
#define MCEXEC_UP_PREPARE_DMA 0x30a02910
|
#define MCEXEC_UP_PREPARE_DMA 0x30a02910
|
||||||
#define MCEXEC_UP_FREE_DMA 0x30a02911
|
#define MCEXEC_UP_FREE_DMA 0x30a02911
|
||||||
|
|
||||||
|
#define MCEXEC_UP_TEST_OPEN_EXEC 0x30a02912
|
||||||
|
|
||||||
#define MCEXEC_UP_TRANSFER_TO_REMOTE 0
|
#define MCEXEC_UP_TRANSFER_TO_REMOTE 0
|
||||||
#define MCEXEC_UP_TRANSFER_FROM_REMOTE 1
|
#define MCEXEC_UP_TRANSFER_FROM_REMOTE 1
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,8 @@
|
|||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/file.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
@ -690,6 +692,24 @@ long mcexec_ret_syscall(ihk_os_t os, struct syscall_ret_desc *__user arg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mcexec_test_open_exec(ihk_os_t os, char * __user filename)
|
||||||
|
{
|
||||||
|
struct file *file;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
file = open_exec(filename);
|
||||||
|
retval = PTR_ERR(file);
|
||||||
|
if (IS_ERR(file)) {
|
||||||
|
goto out_return;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = 0;
|
||||||
|
fput(file);
|
||||||
|
|
||||||
|
out_return:
|
||||||
|
return -retval;
|
||||||
|
}
|
||||||
|
|
||||||
long mcexec_strncpy_from_user(ihk_os_t os, struct strncpy_from_user_desc * __user arg)
|
long mcexec_strncpy_from_user(ihk_os_t os, struct strncpy_from_user_desc * __user arg)
|
||||||
{
|
{
|
||||||
struct strncpy_from_user_desc desc;
|
struct strncpy_from_user_desc desc;
|
||||||
@ -770,7 +790,11 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg)
|
|||||||
return mcexec_get_cpu(os);
|
return mcexec_get_cpu(os);
|
||||||
|
|
||||||
case MCEXEC_UP_STRNCPY_FROM_USER:
|
case MCEXEC_UP_STRNCPY_FROM_USER:
|
||||||
return mcexec_strncpy_from_user(os, (struct strncpy_from_user_desc *)arg);
|
return mcexec_strncpy_from_user(os,
|
||||||
|
(struct strncpy_from_user_desc *)arg);
|
||||||
|
|
||||||
|
case MCEXEC_UP_TEST_OPEN_EXEC:
|
||||||
|
return mcexec_test_open_exec(os, (char *)arg);
|
||||||
|
|
||||||
case MCEXEC_UP_PREPARE_DMA:
|
case MCEXEC_UP_PREPARE_DMA:
|
||||||
return mcexec_pin_region(os, (unsigned long *)arg);
|
return mcexec_pin_region(os, (unsigned long *)arg);
|
||||||
|
|||||||
@ -57,6 +57,7 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = {
|
|||||||
{ .request = MCEXEC_UP_STRNCPY_FROM_USER, .func = mcctrl_ioctl },
|
{ .request = MCEXEC_UP_STRNCPY_FROM_USER, .func = mcctrl_ioctl },
|
||||||
{ .request = MCEXEC_UP_PREPARE_DMA, .func = mcctrl_ioctl },
|
{ .request = MCEXEC_UP_PREPARE_DMA, .func = mcctrl_ioctl },
|
||||||
{ .request = MCEXEC_UP_FREE_DMA, .func = mcctrl_ioctl },
|
{ .request = MCEXEC_UP_FREE_DMA, .func = mcctrl_ioctl },
|
||||||
|
{ .request = MCEXEC_UP_TEST_OPEN_EXEC, .func = mcctrl_ioctl },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct ihk_os_user_call mcctrl_uc_proto = {
|
static struct ihk_os_user_call mcctrl_uc_proto = {
|
||||||
|
|||||||
@ -520,6 +520,12 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
|
|||||||
|
|
||||||
rewind(fp);
|
rewind(fp);
|
||||||
|
|
||||||
|
if ((ret = ioctl(fd, MCEXEC_UP_TEST_OPEN_EXEC, filename)) != 0) {
|
||||||
|
fprintf(stderr, "Error: open_exec() fails for %s: %d (fd: %d)\n",
|
||||||
|
filename, ret, fd);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
desc = load_elf(fp, &interp_path);
|
desc = load_elf(fp, &interp_path);
|
||||||
if (!desc) {
|
if (!desc) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@ -989,6 +995,13 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
__dprintf("%s", "\n");
|
__dprintf("%s", "\n");
|
||||||
|
|
||||||
|
/* Open OS chardev for ioctl() */
|
||||||
|
fd = open(dev, O_RDWR);
|
||||||
|
if (fd < 0) {
|
||||||
|
fprintf(stderr, "Error: Failed to open %s.\n", dev);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (lookup_exec_path(argv[optind], path, sizeof(path)) != 0) {
|
if (lookup_exec_path(argv[optind], path, sizeof(path)) != 0) {
|
||||||
fprintf(stderr, "error: finding file: %s\n", argv[optind]);
|
fprintf(stderr, "error: finding file: %s\n", argv[optind]);
|
||||||
return 1;
|
return 1;
|
||||||
@ -1053,12 +1066,6 @@ int main(int argc, char **argv)
|
|||||||
desc->rlimit_stack_cur = rlim_stack.rlim_cur;
|
desc->rlimit_stack_cur = rlim_stack.rlim_cur;
|
||||||
desc->rlimit_stack_max = rlim_stack.rlim_max;
|
desc->rlimit_stack_max = rlim_stack.rlim_max;
|
||||||
|
|
||||||
fd = open(dev, O_RDWR);
|
|
||||||
if (fd < 0) {
|
|
||||||
fprintf(stderr, "Error: Failed to open %s.\n", dev);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ncpu = ioctl(fd, MCEXEC_UP_GET_CPU, 0);
|
ncpu = ioctl(fd, MCEXEC_UP_GET_CPU, 0);
|
||||||
if(ncpu == -1){
|
if(ncpu == -1){
|
||||||
fprintf(stderr, "No CPU found.\n");
|
fprintf(stderr, "No CPU found.\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user