android_kernel_oneplus_msm8998/drivers/media/v4l2-core
Daniel Mentz e87f959666 media: v4l2-compat-ioctl32.c: refactor compat ioctl32 logic
commit a1dfb4c48cc1e64eeb7800a27c66a6f7e88d075a upstream.

The 32-bit compat v4l2 ioctl handling is implemented based on its 64-bit
equivalent. It converts 32-bit data structures into its 64-bit
equivalents and needs to provide the data to the 64-bit ioctl in user
space memory which is commonly allocated using
compat_alloc_user_space().

However, due to how that function is implemented, it can only be called
a single time for every syscall invocation.

Supposedly to avoid this limitation, the existing code uses a mix of
memory from the kernel stack and memory allocated through
compat_alloc_user_space().

Under normal circumstances, this would not work, because the 64-bit
ioctl expects all pointers to point to user space memory. As a
workaround, set_fs(KERNEL_DS) is called to temporarily disable this
extra safety check and allow kernel pointers. However, this might
introduce a security vulnerability: The result of the 32-bit to 64-bit
conversion is writeable by user space because the output buffer has been
allocated via compat_alloc_user_space(). A malicious user space process
could then manipulate pointers inside this output buffer, and due to the
previous set_fs(KERNEL_DS) call, functions like get_user() or put_user()
no longer prevent kernel memory access.

The new approach is to pre-calculate the total amount of user space
memory that is needed, allocate it using compat_alloc_user_space() and
then divide up the allocated memory to accommodate all data structures
that need to be converted.

An alternative approach would have been to retain the union type karg
that they allocated on the kernel stack in do_video_ioctl(), copy all
data from user space into karg and then back to user space. However, we
decided against this approach because it does not align with other
compat syscall implementations. Instead, we tried to replicate the
get_user/put_user pairs as found in other places in the kernel:

    if (get_user(clipcount, &up->clipcount) ||
        put_user(clipcount, &kp->clipcount)) return -EFAULT;

Notes from hans.verkuil@cisco.com:

This patch was taken from:
    97b733953c

Clearly nobody could be bothered to upstream this patch or at minimum
tell us :-( We only heard about this a week ago.

This patch was rebased and cleaned up. Compared to the original I
also swapped the order of the convert_in_user arguments so that they
matched copy_in_user. It was hard to review otherwise. I also replaced
the ALLOC_USER_SPACE/ALLOC_AND_GET by a normal function.

Fixes: 6b5a9492ca ("v4l: introduce string control support.")

Signed-off-by: Daniel Mentz <danielmentz@google.com>
Co-developed-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-02-16 20:09:45 +01:00
..
Kconfig [media] v4l2-flash-led-class: Add missing VIDEO_V4L2 Kconfig dependency 2015-10-22 15:48:27 -02:00
Makefile [media] media: videobuf2: Prepare to divide videobuf2 2015-10-20 15:12:45 -02:00
tuner-core.c [media] Drop owner assignment from i2c_driver 2015-08-11 13:01:57 -03:00
v4l2-async.c v4l: async: Add a pointer to of_node to struct v4l2_subdev, match it 2015-06-15 11:37:05 -07:00
v4l2-clk.c [media] V4L: add CCF support to the v4l2_clk API 2015-04-02 18:33:42 -03:00
v4l2-common.c [media] v4l2-common: move v4l2_ctrl_check to cx2341x 2014-11-25 08:25:36 -02:00
v4l2-compat-ioctl32.c media: v4l2-compat-ioctl32.c: refactor compat ioctl32 logic 2018-02-16 20:09:45 +01:00
v4l2-ctrls.c media: v4l2-ctrl: Fix flags field on Control events 2017-11-30 08:37:25 +00:00
v4l2-dev.c [media] v4l2: add support for SDR transmitter 2015-10-20 15:40:50 -02:00
v4l2-device.c [media] v4l2-core: remove the old .ioctl BKL replacement 2015-03-02 17:06:56 -03:00
v4l2-dv-timings.c [media] v4l2-dv-timings: print refresh rate with better precision 2015-07-06 08:25:53 -03:00
v4l2-event.c [media] v4l2-event: v4l2_event_queue: do nothing if vdev == NULL 2015-07-17 09:15:27 -03:00
v4l2-fh.c [media] media: v4l2-core: remove the use of V4L2_FL_USE_FH_PRIO flag 2014-07-04 16:14:22 -03:00
v4l2-flash-led-class.c media: Add registration helpers for V4L2 flash sub-devices 2015-06-22 13:53:16 -07:00
v4l2-ioctl.c media: v4l2-ioctl.c: don't copy back the result for -ENOTTY 2018-02-16 20:09:43 +01:00
v4l2-mem2mem.c [media] media: videobuf2: Restructure vb2_buffer 2015-10-01 09:04:43 -03:00
v4l2-of.c [media] v4l: of: Correct pclk-sample for BT656 bus 2015-06-06 07:27:04 -03:00
v4l2-subdev.c [media] Add helper function for subdev event notifications 2015-07-17 09:45:50 -03:00
v4l2-trace.c [media] media: videobuf2: Prepare to divide videobuf2 2015-10-20 15:12:45 -02:00
vb2-trace.c [media] media: videobuf2: Prepare to divide videobuf2 2015-10-20 15:12:45 -02:00
videobuf-core.c [media] v4l2: add support for SDR transmitter 2015-10-20 15:40:50 -02:00
videobuf-dma-contig.c [media] videobuf-dma-contig: set vm_pgoff to be zero to pass the sanity check in vm_iomap_memory() 2014-10-24 09:32:41 -02:00
videobuf-dma-sg.c [media] videobuf: make unused exported functions static 2015-01-27 10:01:33 -02:00
videobuf-dvb.c
videobuf-vmalloc.c
videobuf2-core.c vb2: Fix an off by one error in 'vb2_plane_vaddr' 2017-06-26 07:13:08 +02:00
videobuf2-dma-contig.c [media] media: vb2 dma-contig: Fully cache synchronise buffers in prepare and finish 2015-10-20 14:35:52 -02:00
videobuf2-dma-sg.c [media] media: vb2 dma-sg: Fully cache synchronise buffers in prepare and finish 2015-10-20 14:36:24 -02:00
videobuf2-dvb.c [media] vb2: Add videobuf2-dvb support 2014-04-16 18:59:29 -03:00
videobuf2-internal.h [media] media: videobuf2: Move v4l2-specific stuff to videobuf2-v4l2 2015-10-20 15:14:28 -02:00
videobuf2-memops.c vb2-memops: Fix over allocation of frame vectors 2016-05-04 14:48:48 -07:00
videobuf2-v4l2.c vb2: V4L2_BUF_FLAG_DONE is set after DQBUF 2018-02-16 20:09:43 +01:00
videobuf2-vmalloc.c [media] media: videobuf2: Replace videobuf2-core with videobuf2-v4l2 2015-10-01 08:48:18 -03:00