fix /proc/pid/mem, /proc/pid/status, /proc/pid/cmdline

This commit is contained in:
Tomoki Shirasawa
2015-07-02 00:22:35 +09:00
parent fa79db3bcc
commit 59ee251e1c
8 changed files with 207 additions and 190 deletions

View File

@@ -39,6 +39,8 @@
#define MCEXEC_UP_GET_CPU 0x30a02907
#define MCEXEC_UP_STRNCPY_FROM_USER 0x30a02908
#define MCEXEC_UP_NEW_PROCESS 0x30a02909
#define MCEXEC_UP_GET_CRED 0x30a0290a
#define MCEXEC_UP_GET_CREDV 0x30a0290b
#define MCEXEC_UP_PREPARE_DMA 0x30a02910
#define MCEXEC_UP_FREE_DMA 0x30a02911
@@ -80,14 +82,7 @@ struct program_load_desc {
int err;
int stack_prot;
int pgid;
int ruid;
int euid;
int suid;
int fsuid;
int rgid;
int egid;
int sgid;
int fsgid;
int cred[8];
unsigned long entry;
unsigned long user_start;
unsigned long user_end;

View File

@@ -786,6 +786,40 @@ struct mckernel_exec_file {
struct list_head list;
};
int
mcexec_getcred(unsigned long phys)
{
int *virt = phys_to_virt(phys);
virt[0] = current_uid();
virt[1] = current_euid();
virt[2] = current_suid();
virt[3] = current_fsuid();
virt[4] = current_gid();
virt[5] = current_egid();
virt[6] = current_sgid();
virt[7] = current_fsgid();
return 0;
}
int
mcexec_getcredv(int __user *virt)
{
int wk[8];
wk[0] = current_uid();
wk[1] = current_euid();
wk[2] = current_suid();
wk[3] = current_fsuid();
wk[4] = current_gid();
wk[5] = current_egid();
wk[6] = current_sgid();
wk[7] = current_fsgid();
if(copy_to_user(virt, wk, sizeof(int) * 8))
return -EFAULT;
return 0;
}
int mcexec_open_exec(ihk_os_t os, char * __user filename)
{
struct file *file;
@@ -957,6 +991,13 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
case MCEXEC_UP_FREE_DMA:
return mcexec_free_region(os, (unsigned long *)arg);
case MCEXEC_UP_GET_CRED:
return mcexec_getcred((unsigned long)arg);
case MCEXEC_UP_GET_CREDV:
return mcexec_getcredv((int *)arg);
case MCEXEC_UP_DEBUG_LOG:
return mcexec_debug_log(os, arg);
}

View File

@@ -65,6 +65,8 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = {
{ .request = MCEXEC_UP_FREE_DMA, .func = mcctrl_ioctl },
{ .request = MCEXEC_UP_OPEN_EXEC, .func = mcctrl_ioctl },
{ .request = MCEXEC_UP_CLOSE_EXEC, .func = mcctrl_ioctl },
{ .request = MCEXEC_UP_GET_CRED, .func = mcctrl_ioctl },
{ .request = MCEXEC_UP_GET_CREDV, .func = mcctrl_ioctl },
{ .request = MCEXEC_UP_DEBUG_LOG, .func = mcctrl_ioctl },
};

View File

@@ -159,12 +159,6 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
int load_addr_set = 0;
static char interp_path[PATH_MAX];
ssize_t ss;
uid_t ruid;
uid_t euid;
uid_t suid;
gid_t rgid;
gid_t egid;
gid_t sgid;
*interp_pathp = NULL;
@@ -248,18 +242,8 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
}
desc->pid = getpid();
desc->pgid = getpgid(0);
getresuid(&ruid, &euid, &suid);
getresgid(&rgid, &egid, &sgid);
desc->ruid = ruid;
desc->euid = euid;
desc->suid = suid;
// desc->fsuid = setfsuid(-1);
desc->rgid = rgid;
desc->egid = egid;
desc->sgid = sgid;
// desc->fsgid = setfsgid(-1);
desc->entry = hdr.e_entry;
ioctl(fd, MCEXEC_UP_GET_CREDV, desc->cred);
desc->at_phdr = load_addr + hdr.e_phoff;
desc->at_phent = sizeof(phdr);
desc->at_phnum = hdr.e_phnum;
@@ -2046,6 +2030,17 @@ return_execve2:
do_syscall_return(fd, cpu, 0, 0, 0, 0, 0);
break;
case __NR_setfsuid:
if(w.sr.args[1] == 1){
ioctl(fd, MCEXEC_UP_GET_CRED, w.sr.args[0]);
ret = 0;
}
else{
ret = setfsuid(w.sr.args[0]);
}
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
break;
case __NR_close:
if(w.sr.args[0] == fd)
ret = -EBADF;
@@ -2055,8 +2050,8 @@ return_execve2:
break;
default:
ret = do_generic_syscall(&w);
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
ret = do_generic_syscall(&w);
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
break;
}