[PATCH 4/9] VC04_SERVICES: Add compat ioctl handler for "queue message"
Dan Carpenter
dan.carpenter at oracle.com
Thu Jan 19 01:14:50 PST 2017
On Wed, Jan 18, 2017 at 07:04:48AM -0800, Michael Zoran wrote:
> Add compat handler for "queue message" ioctl.
>
> Signed-off-by: Michael Zoran <mzoran at crowfest.net>
> ---
> .../vc04_services/interface/vchiq_arm/vchiq_arm.c | 36 ++++++++++++++++++++++
> 1 file changed, 36 insertions(+)
>
> diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> index e26949247f91..1c0afa318036 100644
> --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> @@ -1271,6 +1271,41 @@ vchiq_ioctl_compat_internal(
> }
> } break;
>
> + case VCHIQ_IOC_QUEUE_MESSAGE32: {
> + struct vchiq_queue_message32 args32;
To be honest, it would probably be easier if we introduced the
vchiq_queue_message32 in this patch instead of patch 1 so I can review
it without flipping back and forth in my emails.
> + VCHIQ_ELEMENT_T elements[MAX_ELEMENTS];
> + struct vchiq_element32 elements32[MAX_ELEMENTS];
> + unsigned int i;
Just "int i". No need to get fancy.
> +
> + if (copy_from_user
> + (&args32, (const void __user *)arg,
Cast at the beginning. No need for these consts.
> + sizeof(args32))) {
> + ret = -EFAULT;
> + break;
return -EFAULT;
> + }
> +
> + service = find_service_for_instance(instance, args32.handle);
> +
> + if (!service || args32.count > MAX_ELEMENTS) {
Move the "args32.count > MAX_ELEMENTS" directly after the copy.
> + ret = -EINVAL;
> + break;
> + }
> +
> + if (copy_from_user(elements32, compat_ptr(args32.elements),
> + args32.count * sizeof(struct vchiq_element32))) {
> + ret = -EFAULT;
> + break;
> + }
> +
> + for (i = 0; i < args32.count; i++) {
> + elements[i].data = compat_ptr(elements32[i].data);
> + elements[i].size = elements32[i].size;
> + }
> +
> + status = vchiq_ioc_queue_message(args32.handle,
> + elements, args32.count);
Btw, I notice that in vchiq_ioc_queue_message() "total_size +=
elements[i].size;" can have an integer overflow. What are the security
implications of that?
We're not checking "status" here and that's probably a bug.
> + } break;
Move the break.
This patch is basically OK.
regards,
dan carpenter
More information about the linux-rpi-kernel
mailing list