[libcamera-devel] [PATCH] v4l2: Accept read-only buffers mappings and require MAP_SHARED

Nejc Galof galof.nejc at gmail.com
Fri Jan 28 23:18:01 CET 2022


Tested-by: Nejc <galof.nejc at gmail.com>

V V pet., 28. jan. 2022 ob 23:02 je oseba Nejc Galof <galof.nejc at gmail.com>
napisala:

> Hello.
> Tomorrow I will test and send you an answer.
>
> Thank you
> Nejc Galof
>
> V V pet., 28. jan. 2022 ob 23:00 je oseba Laurent Pinchart <
> laurent.pinchart at ideasonboard.com> napisala:
>
>> V4L2 is happy to map buffers read-only for capture devices (but rejects
>> write-only mappings). We can support this as the dmabuf mmap()
>> implementation supports it. This change fixes usage of the V4L2
>> compatibility layer with OpenCV.
>>
>> While at it, attempt to validate the other flags. videobuf2 requires
>> MAP_SHARED and doesn't check other flags, so mimic the same behaviour.
>> While unlikly, other flags could get rejected by other kernel layers for
>> V4L2 buffers but not for dmabuf. This can be handled later if the need
>> arises.
>>
>> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>> ---
>>  src/v4l2/v4l2_camera_proxy.cpp | 13 +++++++++++--
>>  1 file changed, 11 insertions(+), 2 deletions(-)
>>
>> Nejc, could you please test this patch ? It's slightly different than
>> the one I've shared on the IRC channel. If you don't mind appearing in
>> the git development history, you can reply with
>>
>> Tested-by: Name <email at address>
>>
>> and I'll add that (as well as a corresponding Reported-by tag) to the
>> commit before pushing it.
>>
>> diff --git a/src/v4l2/v4l2_camera_proxy.cpp
>> b/src/v4l2/v4l2_camera_proxy.cpp
>> index f3470a6d312a..ebe7601a4ba6 100644
>> --- a/src/v4l2/v4l2_camera_proxy.cpp
>> +++ b/src/v4l2/v4l2_camera_proxy.cpp
>> @@ -104,8 +104,17 @@ void *V4L2CameraProxy::mmap(V4L2CameraFile *file,
>> void *addr, size_t length,
>>
>>         MutexLocker locker(proxyMutex_);
>>
>> -       /* \todo Validate prot and flags properly. */
>> -       if (prot != (PROT_READ | PROT_WRITE)) {
>> +       /*
>> +        * Mimic the videobuf2 behaviour, which requires PROT_READ. Reject
>> +        * PROT_EXEC as it makes no sense.
>> +        */
>> +       if (!(prot & PROT_READ) || prot & PROT_EXEC) {
>> +               errno = EINVAL;
>> +               return MAP_FAILED;
>> +       }
>> +
>> +       /* videobuf2 also requires MAP_SHARED. */
>> +       if (!(flags & MAP_SHARED)) {
>>                 errno = EINVAL;
>>                 return MAP_FAILED;
>>         }
>>
>> base-commit: 7ea52d2b586144fdc033a3ffc1c4a4bbb99b5440
>> --
>> Regards,
>>
>> Laurent Pinchart
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20220128/70e2e6a6/attachment.htm>


More information about the libcamera-devel mailing list