open: check filename address (re-commit)
This commit is contained in:
@@ -2171,26 +2171,18 @@ int copy_from_user(void *dst, const void *src, size_t siz)
|
|||||||
int strlen_user(const char *s)
|
int strlen_user(const char *s)
|
||||||
{
|
{
|
||||||
struct process_vm *vm = cpu_local_var(current)->vm;
|
struct process_vm *vm = cpu_local_var(current)->vm;
|
||||||
struct vm_range *range;
|
|
||||||
unsigned long pgstart;
|
unsigned long pgstart;
|
||||||
int maxlen;
|
int maxlen;
|
||||||
const char *head = s;
|
const char *head = s;
|
||||||
|
int err;
|
||||||
|
|
||||||
maxlen = 4096 - (((unsigned long)s) & 0x0000000000000fffUL);
|
maxlen = 4096 - (((unsigned long)s) & 0x0000000000000fffUL);
|
||||||
pgstart = ((unsigned long)s) & 0xfffffffffffff000UL;
|
pgstart = ((unsigned long)s) & 0xfffffffffffff000UL;
|
||||||
if(!pgstart || pgstart >= MAP_KERNEL_START)
|
if(!pgstart || pgstart >= MAP_KERNEL_START)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
|
|
||||||
for(;;){
|
for(;;){
|
||||||
range = lookup_process_memory_range(vm, pgstart, pgstart+1);
|
if ((err = verify_process_vm(vm, s, 1)))
|
||||||
if(range == NULL){
|
return err;
|
||||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
if((range->flag & VR_PROT_MASK) == VR_PROT_NONE){
|
|
||||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
while(*s && maxlen > 0){
|
while(*s && maxlen > 0){
|
||||||
s++;
|
s++;
|
||||||
maxlen--;
|
maxlen--;
|
||||||
@@ -2200,14 +2192,12 @@ int strlen_user(const char *s)
|
|||||||
maxlen = 4096;
|
maxlen = 4096;
|
||||||
pgstart += 4096;
|
pgstart += 4096;
|
||||||
}
|
}
|
||||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
|
||||||
return s - head;
|
return s - head;
|
||||||
}
|
}
|
||||||
|
|
||||||
int strcpy_from_user(char *dst, const char *src)
|
int strcpy_from_user(char *dst, const char *src)
|
||||||
{
|
{
|
||||||
struct process_vm *vm = cpu_local_var(current)->vm;
|
struct process_vm *vm = cpu_local_var(current)->vm;
|
||||||
struct vm_range *range;
|
|
||||||
unsigned long pgstart;
|
unsigned long pgstart;
|
||||||
int maxlen;
|
int maxlen;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
@@ -2216,17 +2206,9 @@ int strcpy_from_user(char *dst, const char *src)
|
|||||||
pgstart = ((unsigned long)src) & 0xfffffffffffff000UL;
|
pgstart = ((unsigned long)src) & 0xfffffffffffff000UL;
|
||||||
if(!pgstart || pgstart >= MAP_KERNEL_START)
|
if(!pgstart || pgstart >= MAP_KERNEL_START)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
|
|
||||||
for(;;){
|
for(;;){
|
||||||
range = lookup_process_memory_range(vm, pgstart, pgstart + 1);
|
if ((err = verify_process_vm(vm, src, 1)))
|
||||||
if(range == NULL){
|
return err;
|
||||||
err = -EFAULT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if((range->flag & VR_PROT_MASK) == VR_PROT_NONE){
|
|
||||||
err = -EFAULT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while(*src && maxlen > 0){
|
while(*src && maxlen > 0){
|
||||||
*(dst++) = *(src++);
|
*(dst++) = *(src++);
|
||||||
maxlen--;
|
maxlen--;
|
||||||
@@ -2238,7 +2220,6 @@ int strcpy_from_user(char *dst, const char *src)
|
|||||||
maxlen = 4096;
|
maxlen = 4096;
|
||||||
pgstart += 4096;
|
pgstart += 4096;
|
||||||
}
|
}
|
||||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2834,12 +2834,26 @@ SYSCALL_DECLARE(ioctl)
|
|||||||
SYSCALL_DECLARE(open)
|
SYSCALL_DECLARE(open)
|
||||||
{
|
{
|
||||||
const char *pathname = (const char *)ihk_mc_syscall_arg0(ctx);
|
const char *pathname = (const char *)ihk_mc_syscall_arg0(ctx);
|
||||||
|
int len;
|
||||||
|
char *xpmem_wk;
|
||||||
long rc;
|
long rc;
|
||||||
|
|
||||||
dkprintf("open(): pathname=%s\n", pathname);
|
len = strlen_user(pathname);
|
||||||
if (!strcmp(pathname, XPMEM_DEV_PATH)) {
|
if (len < 0)
|
||||||
|
return len;
|
||||||
|
if (!(xpmem_wk = kmalloc(len + 1, IHK_MC_AP_NOWAIT)))
|
||||||
|
return -ENOMEM;
|
||||||
|
if (copy_from_user(xpmem_wk, pathname, len + 1)) {
|
||||||
|
kfree(xpmem_wk);
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
dkprintf("open(): pathname=%s\n", xpmem_wk);
|
||||||
|
rc = strcmp(xpmem_wk, XPMEM_DEV_PATH);
|
||||||
|
kfree(xpmem_wk);
|
||||||
|
if (!rc) {
|
||||||
rc = xpmem_open(ctx);
|
rc = xpmem_open(ctx);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
rc = syscall_generic_forwarding(__NR_open, ctx);
|
rc = syscall_generic_forwarding(__NR_open, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user