|
@@ -280,7 +280,6 @@ static int compat_get_fastrpc_ioctl_invoke(
|
|
if (err)
|
|
if (err)
|
|
return err;
|
|
return err;
|
|
pra32 = compat_ptr(p);
|
|
pra32 = compat_ptr(p);
|
|
- pra = (union remote_arg *)(inv + 1);
|
|
|
|
for (j = 0; j < len; j++) {
|
|
for (j = 0; j < len; j++) {
|
|
err |= get_user(p, &pra32[j].buf.pv);
|
|
err |= get_user(p, &pra32[j].buf.pv);
|
|
memcpy((uintptr_t *)&pra[j].buf.pv, &p, sizeof(p));
|
|
memcpy((uintptr_t *)&pra[j].buf.pv, &p, sizeof(p));
|
|
@@ -288,12 +287,11 @@ static int compat_get_fastrpc_ioctl_invoke(
|
|
memcpy(&pra[j].buf.len, &s, sizeof(s));
|
|
memcpy(&pra[j].buf.len, &s, sizeof(s));
|
|
}
|
|
}
|
|
|
|
|
|
- inv->fds = NULL;
|
|
|
|
if (cmd != COMPAT_FASTRPC_IOCTL_INVOKE) {
|
|
if (cmd != COMPAT_FASTRPC_IOCTL_INVOKE) {
|
|
err |= get_user(p, &inv32->fds);
|
|
err |= get_user(p, &inv32->fds);
|
|
memcpy(&inv->fds, &p, sizeof(p));
|
|
memcpy(&inv->fds, &p, sizeof(p));
|
|
}
|
|
}
|
|
- inv->attrs = NULL;
|
|
|
|
|
|
+
|
|
if ((cmd == COMPAT_FASTRPC_IOCTL_INVOKE_ATTRS) ||
|
|
if ((cmd == COMPAT_FASTRPC_IOCTL_INVOKE_ATTRS) ||
|
|
(cmd == COMPAT_FASTRPC_IOCTL_INVOKE_CRC) ||
|
|
(cmd == COMPAT_FASTRPC_IOCTL_INVOKE_CRC) ||
|
|
(cmd == COMPAT_FASTRPC_IOCTL_INVOKE_PERF) ||
|
|
(cmd == COMPAT_FASTRPC_IOCTL_INVOKE_PERF) ||
|
|
@@ -301,19 +299,17 @@ static int compat_get_fastrpc_ioctl_invoke(
|
|
err |= get_user(p, &inv32->attrs);
|
|
err |= get_user(p, &inv32->attrs);
|
|
memcpy(&inv->attrs, &p, sizeof(p));
|
|
memcpy(&inv->attrs, &p, sizeof(p));
|
|
}
|
|
}
|
|
- inv->crc = NULL;
|
|
|
|
|
|
+
|
|
if ((cmd == COMPAT_FASTRPC_IOCTL_INVOKE_CRC) ||
|
|
if ((cmd == COMPAT_FASTRPC_IOCTL_INVOKE_CRC) ||
|
|
(cmd == COMPAT_FASTRPC_IOCTL_INVOKE_PERF)) {
|
|
(cmd == COMPAT_FASTRPC_IOCTL_INVOKE_PERF)) {
|
|
err |= get_user(p, &inv32->crc);
|
|
err |= get_user(p, &inv32->crc);
|
|
memcpy(&inv->crc, &p, sizeof(p));
|
|
memcpy(&inv->crc, &p, sizeof(p));
|
|
}
|
|
}
|
|
- inv->job = NULL;
|
|
|
|
|
|
+
|
|
if (cmd == FASTRPC_INVOKE2_ASYNC) {
|
|
if (cmd == FASTRPC_INVOKE2_ASYNC) {
|
|
err |= get_user(p, &inv32->job);
|
|
err |= get_user(p, &inv32->job);
|
|
memcpy(&inv->job, &p, sizeof(p));
|
|
memcpy(&inv->job, &p, sizeof(p));
|
|
}
|
|
}
|
|
- inv->perf_kernel = NULL;
|
|
|
|
- inv->perf_dsp = NULL;
|
|
|
|
|
|
|
|
if ((cmd == COMPAT_FASTRPC_IOCTL_INVOKE_PERF) || (cmd == FASTRPC_INVOKE2_ASYNC)) {
|
|
if ((cmd == COMPAT_FASTRPC_IOCTL_INVOKE_PERF) || (cmd == FASTRPC_INVOKE2_ASYNC)) {
|
|
err |= get_user(k, &inv32->perf_kernel);
|
|
err |= get_user(k, &inv32->perf_kernel);
|
|
@@ -328,7 +324,7 @@ static int compat_fastrpc_ioctl_invoke(struct file *filp,
|
|
unsigned int cmd, unsigned long arg)
|
|
unsigned int cmd, unsigned long arg)
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_invoke_async __user *inv32;
|
|
struct compat_fastrpc_ioctl_invoke_async __user *inv32;
|
|
- struct fastrpc_ioctl_invoke_async *inv;
|
|
|
|
|
|
+ struct fastrpc_ioctl_invoke_async *inv = NULL;
|
|
compat_uint_t sc = 0;
|
|
compat_uint_t sc = 0;
|
|
int err = 0, len = 0;
|
|
int err = 0, len = 0;
|
|
struct fastrpc_file *fl = (struct fastrpc_file *)filp->private_data;
|
|
struct fastrpc_file *fl = (struct fastrpc_file *)filp->private_data;
|
|
@@ -338,16 +334,20 @@ static int compat_fastrpc_ioctl_invoke(struct file *filp,
|
|
if (err)
|
|
if (err)
|
|
return err;
|
|
return err;
|
|
len = REMOTE_SCALARS_LENGTH(sc);
|
|
len = REMOTE_SCALARS_LENGTH(sc);
|
|
- VERIFY(err, NULL != (inv = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (inv = kzalloc(
|
|
sizeof(*inv) + len * sizeof(union remote_arg), GFP_KERNEL)));
|
|
sizeof(*inv) + len * sizeof(union remote_arg), GFP_KERNEL)));
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
|
|
+
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_invoke(inv32,
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_invoke(inv32,
|
|
inv, cmd, sc));
|
|
inv, cmd, sc));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(inv);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
VERIFY(err, 0 == (err = fastrpc_internal_invoke(fl,
|
|
VERIFY(err, 0 == (err = fastrpc_internal_invoke(fl,
|
|
fl->mode, COMPAT_MSG, inv)));
|
|
fl->mode, COMPAT_MSG, inv)));
|
|
|
|
+ kfree(inv);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -386,7 +386,7 @@ static int compat_get_fastrpc_ioctl_invoke2(
|
|
if (err)
|
|
if (err)
|
|
goto bail;
|
|
goto bail;
|
|
len = REMOTE_SCALARS_LENGTH(sc);
|
|
len = REMOTE_SCALARS_LENGTH(sc);
|
|
- VERIFY(err, NULL != (inv2_user = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (inv2_user = kzalloc(
|
|
sizeof(*inv2_user) + sizeof(*asyncinv_user) +
|
|
sizeof(*inv2_user) + sizeof(*asyncinv_user) +
|
|
len * sizeof(union remote_arg), GFP_KERNEL)));
|
|
len * sizeof(union remote_arg), GFP_KERNEL)));
|
|
if (err) {
|
|
if (err) {
|
|
@@ -402,11 +402,8 @@ static int compat_get_fastrpc_ioctl_invoke2(
|
|
if (err)
|
|
if (err)
|
|
goto bail;
|
|
goto bail;
|
|
|
|
|
|
- asyncinv_user->job = NULL;
|
|
|
|
err |= get_user(p, &lasync32_old->job);
|
|
err |= get_user(p, &lasync32_old->job);
|
|
memcpy(&asyncinv_user->job, &p, sizeof(p));
|
|
memcpy(&asyncinv_user->job, &p, sizeof(p));
|
|
- asyncinv_user->perf_kernel = NULL;
|
|
|
|
- asyncinv_user->perf_dsp = NULL;
|
|
|
|
} else {
|
|
} else {
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_invoke(lasync32,
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_invoke(lasync32,
|
|
asyncinv_user, req, sc));
|
|
asyncinv_user, req, sc));
|
|
@@ -416,8 +413,6 @@ static int compat_get_fastrpc_ioctl_invoke2(
|
|
memcpy(&inv2_user->req, &req, sizeof(req));
|
|
memcpy(&inv2_user->req, &req, sizeof(req));
|
|
inv2_user->invparam = (uintptr_t)asyncinv_user;
|
|
inv2_user->invparam = (uintptr_t)asyncinv_user;
|
|
inv2_user->size = sizeof(*asyncinv_user);
|
|
inv2_user->size = sizeof(*asyncinv_user);
|
|
- if (err)
|
|
|
|
- goto bail;
|
|
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
case FASTRPC_INVOKE2_ASYNC_RESPONSE:
|
|
case FASTRPC_INVOKE2_ASYNC_RESPONSE:
|
|
@@ -448,7 +443,7 @@ static int compat_get_fastrpc_ioctl_invoke2(
|
|
goto bail;
|
|
goto bail;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- VERIFY(err, NULL != (inv2_user = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (inv2_user = kzalloc(
|
|
sizeof(*inv2_user), GFP_KERNEL)));
|
|
sizeof(*inv2_user), GFP_KERNEL)));
|
|
if (err) {
|
|
if (err) {
|
|
err = -EFAULT;
|
|
err = -EFAULT;
|
|
@@ -457,16 +452,15 @@ static int compat_get_fastrpc_ioctl_invoke2(
|
|
memcpy(&inv2_user->req, &req, sizeof(req));
|
|
memcpy(&inv2_user->req, &req, sizeof(req));
|
|
memcpy(&inv2_user->invparam, &pparam, sizeof(pparam));
|
|
memcpy(&inv2_user->invparam, &pparam, sizeof(pparam));
|
|
memcpy(&inv2_user->size, &size, sizeof(size));
|
|
memcpy(&inv2_user->size, &size, sizeof(size));
|
|
- if (err)
|
|
|
|
- goto bail;
|
|
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
default:
|
|
default:
|
|
err = -ENOTTY;
|
|
err = -ENOTTY;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- *inva = inv2_user;
|
|
|
|
|
|
+
|
|
bail:
|
|
bail:
|
|
|
|
+ *inva = inv2_user;
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -474,17 +468,20 @@ static int compat_fastrpc_ioctl_invoke2(struct file *filp,
|
|
unsigned int cmd, unsigned long arg)
|
|
unsigned int cmd, unsigned long arg)
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_invoke2 __user *inv32;
|
|
struct compat_fastrpc_ioctl_invoke2 __user *inv32;
|
|
- struct fastrpc_ioctl_invoke2 *inv;
|
|
|
|
|
|
+ struct fastrpc_ioctl_invoke2 *inv = NULL;
|
|
int err = 0;
|
|
int err = 0;
|
|
struct fastrpc_file *fl = (struct fastrpc_file *)filp->private_data;
|
|
struct fastrpc_file *fl = (struct fastrpc_file *)filp->private_data;
|
|
|
|
|
|
inv32 = compat_ptr(arg);
|
|
inv32 = compat_ptr(arg);
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_invoke2(inv32,
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_invoke2(inv32,
|
|
&inv, cmd));
|
|
&inv, cmd));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(inv);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
|
|
|
|
VERIFY(err, 0 == (err = fastrpc_internal_invoke2(fl, inv, true)));
|
|
VERIFY(err, 0 == (err = fastrpc_internal_invoke2(fl, inv, true)));
|
|
|
|
+ kfree(inv);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -740,28 +737,30 @@ static int compat_fastrpc_control(struct fastrpc_file *fl,
|
|
{
|
|
{
|
|
int err = 0;
|
|
int err = 0;
|
|
struct compat_fastrpc_ioctl_control __user *ctrl32;
|
|
struct compat_fastrpc_ioctl_control __user *ctrl32;
|
|
- struct fastrpc_ioctl_control *ctrl;
|
|
|
|
|
|
+ struct fastrpc_ioctl_control *ctrl = NULL;
|
|
compat_uptr_t p;
|
|
compat_uptr_t p;
|
|
|
|
|
|
ctrl32 = compat_ptr(arg);
|
|
ctrl32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (ctrl = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (ctrl = kzalloc(
|
|
sizeof(*ctrl), GFP_KERNEL)));
|
|
sizeof(*ctrl), GFP_KERNEL)));
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_control(ctrl32,
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_control(ctrl32,
|
|
ctrl));
|
|
ctrl));
|
|
if (err)
|
|
if (err)
|
|
- return err;
|
|
|
|
|
|
+ goto bail;
|
|
VERIFY(err, 0 == (err = fastrpc_internal_control(fl, ctrl)));
|
|
VERIFY(err, 0 == (err = fastrpc_internal_control(fl, ctrl)));
|
|
if (err)
|
|
if (err)
|
|
- return err;
|
|
|
|
|
|
+ goto bail;
|
|
err = get_user(p, &ctrl32->req);
|
|
err = get_user(p, &ctrl32->req);
|
|
if (err)
|
|
if (err)
|
|
- return err;
|
|
|
|
|
|
+ goto bail;
|
|
if (p == FASTRPC_CONTROL_KALLOC) {
|
|
if (p == FASTRPC_CONTROL_KALLOC) {
|
|
memcpy(&p, &ctrl->kalloc.kalloc_support, sizeof(ctrl->kalloc.kalloc_support));
|
|
memcpy(&p, &ctrl->kalloc.kalloc_support, sizeof(ctrl->kalloc.kalloc_support));
|
|
err |= put_user(p, &ctrl32->kalloc.kalloc_support);
|
|
err |= put_user(p, &ctrl32->kalloc.kalloc_support);
|
|
}
|
|
}
|
|
|
|
+bail:
|
|
|
|
+ kfree(ctrl);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -775,7 +774,7 @@ static int compat_fastrpc_get_dsp_info(struct fastrpc_file *fl,
|
|
size_t info_size = 0;
|
|
size_t info_size = 0;
|
|
|
|
|
|
info32 = compat_ptr(arg);
|
|
info32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (info = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (info = kzalloc(
|
|
sizeof(*info), GFP_KERNEL)));
|
|
sizeof(*info), GFP_KERNEL)));
|
|
info_size = sizeof(*info);
|
|
info_size = sizeof(*info);
|
|
if (err) {
|
|
if (err) {
|
|
@@ -784,20 +783,21 @@ static int compat_fastrpc_get_dsp_info(struct fastrpc_file *fl,
|
|
}
|
|
}
|
|
err = get_user(u, &info32->domain);
|
|
err = get_user(u, &info32->domain);
|
|
if (err)
|
|
if (err)
|
|
- return err;
|
|
|
|
|
|
+ goto bail;
|
|
memcpy(&info->domain, &u, sizeof(info->domain));
|
|
memcpy(&info->domain, &u, sizeof(info->domain));
|
|
|
|
|
|
err = get_user(u, &info32->attribute_ID);
|
|
err = get_user(u, &info32->attribute_ID);
|
|
if (err)
|
|
if (err)
|
|
- return err;
|
|
|
|
|
|
+ goto bail;
|
|
memcpy(&info->attribute_ID, &u, sizeof(info->attribute_ID));
|
|
memcpy(&info->attribute_ID, &u, sizeof(info->attribute_ID));
|
|
|
|
|
|
err = fastrpc_get_info_from_kernel(info, fl);
|
|
err = fastrpc_get_info_from_kernel(info, fl);
|
|
if (err)
|
|
if (err)
|
|
- return err;
|
|
|
|
|
|
+ goto bail;
|
|
|
|
|
|
err = compat_put_fastrpc_ioctl_get_dsp_info(info32, info);
|
|
err = compat_put_fastrpc_ioctl_get_dsp_info(info32, info);
|
|
-
|
|
|
|
|
|
+bail:
|
|
|
|
+ kfree(info);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -810,95 +810,112 @@ static inline long compat_fastrpc_mmap_device_ioctl(struct fastrpc_file *fl,
|
|
case COMPAT_FASTRPC_IOCTL_MEM_MAP:
|
|
case COMPAT_FASTRPC_IOCTL_MEM_MAP:
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_mem_map __user *map32;
|
|
struct compat_fastrpc_ioctl_mem_map __user *map32;
|
|
- struct fastrpc_ioctl_mem_map *map;
|
|
|
|
|
|
+ struct fastrpc_ioctl_mem_map *map = NULL;
|
|
|
|
|
|
map32 = compat_ptr(arg);
|
|
map32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (map = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (map = kzalloc(
|
|
sizeof(*map), GFP_KERNEL)));
|
|
sizeof(*map), GFP_KERNEL)));
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
|
|
|
|
err = compat_get_fastrpc_ioctl_mem_map(map32, map);
|
|
err = compat_get_fastrpc_ioctl_mem_map(map32, map);
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(map);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
|
|
|
|
VERIFY(err, 0 == (err = fastrpc_internal_mem_map(fl,
|
|
VERIFY(err, 0 == (err = fastrpc_internal_mem_map(fl,
|
|
map)));
|
|
map)));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(map);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
VERIFY(err, 0 == compat_put_fastrpc_ioctl_mem_map(map32, map));
|
|
VERIFY(err, 0 == compat_put_fastrpc_ioctl_mem_map(map32, map));
|
|
|
|
+ kfree(map);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
case COMPAT_FASTRPC_IOCTL_MEM_UNMAP:
|
|
case COMPAT_FASTRPC_IOCTL_MEM_UNMAP:
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_mem_unmap __user *unmap32;
|
|
struct compat_fastrpc_ioctl_mem_unmap __user *unmap32;
|
|
- struct fastrpc_ioctl_mem_unmap *unmap;
|
|
|
|
|
|
+ struct fastrpc_ioctl_mem_unmap *unmap = NULL;
|
|
|
|
|
|
unmap32 = compat_ptr(arg);
|
|
unmap32 = compat_ptr(arg);
|
|
- unmap = kmalloc(sizeof(*unmap), GFP_KERNEL);
|
|
|
|
|
|
+ unmap = kzalloc(sizeof(*unmap), GFP_KERNEL);
|
|
if (unmap == NULL)
|
|
if (unmap == NULL)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
|
|
|
|
err = compat_get_fastrpc_ioctl_mem_unmap(unmap32, unmap);
|
|
err = compat_get_fastrpc_ioctl_mem_unmap(unmap32, unmap);
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(unmap);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
|
|
|
|
VERIFY(err, 0 == (err = fastrpc_internal_mem_unmap(fl,
|
|
VERIFY(err, 0 == (err = fastrpc_internal_mem_unmap(fl,
|
|
unmap)));
|
|
unmap)));
|
|
|
|
+ kfree(unmap);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
case COMPAT_FASTRPC_IOCTL_MMAP:
|
|
case COMPAT_FASTRPC_IOCTL_MMAP:
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_mmap __user *map32;
|
|
struct compat_fastrpc_ioctl_mmap __user *map32;
|
|
- struct fastrpc_ioctl_mmap *map;
|
|
|
|
|
|
+ struct fastrpc_ioctl_mmap *map = NULL;
|
|
|
|
|
|
map32 = compat_ptr(arg);
|
|
map32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (map = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (map = kzalloc(
|
|
sizeof(*map), GFP_KERNEL)));
|
|
sizeof(*map), GFP_KERNEL)));
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_mmap(map32, map));
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_mmap(map32, map));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(map);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
|
|
|
|
VERIFY(err, 0 == (err = fastrpc_internal_mmap(fl, map)));
|
|
VERIFY(err, 0 == (err = fastrpc_internal_mmap(fl, map)));
|
|
|
|
|
|
VERIFY(err, 0 == compat_put_fastrpc_ioctl_mmap(map32, map));
|
|
VERIFY(err, 0 == compat_put_fastrpc_ioctl_mmap(map32, map));
|
|
|
|
+ kfree(map);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
case COMPAT_FASTRPC_IOCTL_MMAP_64:
|
|
case COMPAT_FASTRPC_IOCTL_MMAP_64:
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_mmap_64 __user *map32;
|
|
struct compat_fastrpc_ioctl_mmap_64 __user *map32;
|
|
- struct fastrpc_ioctl_mmap *map;
|
|
|
|
|
|
+ struct fastrpc_ioctl_mmap *map = NULL;
|
|
|
|
|
|
map32 = compat_ptr(arg);
|
|
map32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (map = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (map = kzalloc(
|
|
sizeof(*map), GFP_KERNEL)));
|
|
sizeof(*map), GFP_KERNEL)));
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_mmap_64(map32, map));
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_mmap_64(map32, map));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(map);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
VERIFY(err, 0 == (err = fastrpc_internal_mmap(fl, map)));
|
|
VERIFY(err, 0 == (err = fastrpc_internal_mmap(fl, map)));
|
|
VERIFY(err, 0 == compat_put_fastrpc_ioctl_mmap_64(map32, map));
|
|
VERIFY(err, 0 == compat_put_fastrpc_ioctl_mmap_64(map32, map));
|
|
|
|
+ kfree(map);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
case COMPAT_FASTRPC_IOCTL_MUNMAP:
|
|
case COMPAT_FASTRPC_IOCTL_MUNMAP:
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_munmap __user *unmap32;
|
|
struct compat_fastrpc_ioctl_munmap __user *unmap32;
|
|
- struct fastrpc_ioctl_munmap *unmap;
|
|
|
|
|
|
+ struct fastrpc_ioctl_munmap *unmap = NULL;
|
|
|
|
|
|
unmap32 = compat_ptr(arg);
|
|
unmap32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (unmap = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (unmap = kzalloc(
|
|
sizeof(*unmap), GFP_KERNEL)));
|
|
sizeof(*unmap), GFP_KERNEL)));
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_munmap(unmap32,
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_munmap(unmap32,
|
|
unmap));
|
|
unmap));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(unmap);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
VERIFY(err, 0 == (err = fastrpc_internal_munmap(fl,
|
|
VERIFY(err, 0 == (err = fastrpc_internal_munmap(fl,
|
|
unmap)));
|
|
unmap)));
|
|
|
|
+ kfree(unmap);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
default:
|
|
default:
|
|
@@ -991,21 +1008,25 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd,
|
|
case COMPAT_FASTRPC_IOCTL_MUNMAP_64:
|
|
case COMPAT_FASTRPC_IOCTL_MUNMAP_64:
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_munmap_64 __user *unmap32;
|
|
struct compat_fastrpc_ioctl_munmap_64 __user *unmap32;
|
|
- struct fastrpc_ioctl_munmap *unmap;
|
|
|
|
|
|
+ struct fastrpc_ioctl_munmap *unmap = NULL;
|
|
|
|
|
|
unmap32 = compat_ptr(arg);
|
|
unmap32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (unmap = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (unmap = kzalloc(
|
|
sizeof(*unmap), GFP_KERNEL)));
|
|
sizeof(*unmap), GFP_KERNEL)));
|
|
|
|
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_munmap_64(unmap32,
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_munmap_64(unmap32,
|
|
unmap));
|
|
unmap));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(unmap);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
|
|
|
|
VERIFY(err, 0 == (err = fastrpc_internal_munmap(fl,
|
|
VERIFY(err, 0 == (err = fastrpc_internal_munmap(fl,
|
|
unmap)));
|
|
unmap)));
|
|
|
|
+
|
|
|
|
+ kfree(unmap);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
case COMPAT_FASTRPC_IOCTL_INIT:
|
|
case COMPAT_FASTRPC_IOCTL_INIT:
|
|
@@ -1013,40 +1034,46 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd,
|
|
case COMPAT_FASTRPC_IOCTL_INIT_ATTRS:
|
|
case COMPAT_FASTRPC_IOCTL_INIT_ATTRS:
|
|
{
|
|
{
|
|
struct compat_fastrpc_ioctl_init_attrs __user *init32;
|
|
struct compat_fastrpc_ioctl_init_attrs __user *init32;
|
|
- struct fastrpc_ioctl_init_attrs *init;
|
|
|
|
|
|
+ struct fastrpc_ioctl_init_attrs *init = NULL;
|
|
|
|
|
|
init32 = compat_ptr(arg);
|
|
init32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (init = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (init = kzalloc(
|
|
sizeof(*init), GFP_KERNEL)));
|
|
sizeof(*init), GFP_KERNEL)));
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_init(init32,
|
|
VERIFY(err, 0 == compat_get_fastrpc_ioctl_init(init32,
|
|
init, cmd));
|
|
init, cmd));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(init);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
VERIFY(err, 0 == (err = fastrpc_init_process(fl, init)));
|
|
VERIFY(err, 0 == (err = fastrpc_init_process(fl, init)));
|
|
|
|
|
|
|
|
+ kfree(init);
|
|
return err;
|
|
return err;
|
|
|
|
|
|
}
|
|
}
|
|
case FASTRPC_IOCTL_GETINFO:
|
|
case FASTRPC_IOCTL_GETINFO:
|
|
{
|
|
{
|
|
compat_uptr_t __user *info32;
|
|
compat_uptr_t __user *info32;
|
|
- uint32_t *info;
|
|
|
|
|
|
+ uint32_t *info = NULL;
|
|
compat_uint_t u;
|
|
compat_uint_t u;
|
|
|
|
|
|
info32 = compat_ptr(arg);
|
|
info32 = compat_ptr(arg);
|
|
- VERIFY(err, NULL != (info = kmalloc(
|
|
|
|
|
|
+ VERIFY(err, NULL != (info = kzalloc(
|
|
sizeof(*info), GFP_KERNEL)));
|
|
sizeof(*info), GFP_KERNEL)));
|
|
if (err)
|
|
if (err)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
err = get_user(u, info32);
|
|
err = get_user(u, info32);
|
|
memcpy(info, &u, sizeof(u));
|
|
memcpy(info, &u, sizeof(u));
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ kfree(info);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
VERIFY(err, 0 == (err = fastrpc_get_info(fl, info)));
|
|
VERIFY(err, 0 == (err = fastrpc_get_info(fl, info)));
|
|
memcpy(&u, info, sizeof(*info));
|
|
memcpy(&u, info, sizeof(*info));
|
|
err |= put_user(u, info32);
|
|
err |= put_user(u, info32);
|
|
|
|
+ kfree(info);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
case FASTRPC_IOCTL_SETMODE:
|
|
case FASTRPC_IOCTL_SETMODE:
|