v4l2: v4l2_camera_proxy: Check for null arg values in main ioctl handler
The ioctl handlers currently don't check if arg is null, so if it ever is, it will cause a segfault. Check that arg is null and return -EFAULT in the main vidioc ioctl handler. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
02802aa11f
commit
b5d61c86ab
2 changed files with 33 additions and 0 deletions
|
@ -11,6 +11,7 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <linux/videodev2.h>
|
#include <linux/videodev2.h>
|
||||||
|
#include <set>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -521,8 +522,37 @@ int V4L2CameraProxy::vidioc_streamoff(V4L2CameraFile *file, int *arg)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::set<unsigned long> V4L2CameraProxy::supportedIoctls_ = {
|
||||||
|
VIDIOC_QUERYCAP,
|
||||||
|
VIDIOC_ENUM_FMT,
|
||||||
|
VIDIOC_G_FMT,
|
||||||
|
VIDIOC_S_FMT,
|
||||||
|
VIDIOC_TRY_FMT,
|
||||||
|
VIDIOC_REQBUFS,
|
||||||
|
VIDIOC_QUERYBUF,
|
||||||
|
VIDIOC_QBUF,
|
||||||
|
VIDIOC_DQBUF,
|
||||||
|
VIDIOC_STREAMON,
|
||||||
|
VIDIOC_STREAMOFF,
|
||||||
|
};
|
||||||
|
|
||||||
int V4L2CameraProxy::ioctl(V4L2CameraFile *file, unsigned long request, void *arg)
|
int V4L2CameraProxy::ioctl(V4L2CameraFile *file, unsigned long request, void *arg)
|
||||||
{
|
{
|
||||||
|
if (!arg && (_IOC_DIR(request) & _IOC_WRITE)) {
|
||||||
|
errno = EFAULT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (supportedIoctls_.find(request) == supportedIoctls_.end()) {
|
||||||
|
errno = ENOTTY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!arg && (_IOC_DIR(request) & _IOC_READ)) {
|
||||||
|
errno = EFAULT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
switch (request) {
|
switch (request) {
|
||||||
case VIDIOC_QUERYCAP:
|
case VIDIOC_QUERYCAP:
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/videodev2.h>
|
#include <linux/videodev2.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <set>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -68,6 +69,8 @@ private:
|
||||||
static PixelFormat v4l2ToDrm(uint32_t format);
|
static PixelFormat v4l2ToDrm(uint32_t format);
|
||||||
static uint32_t drmToV4L2(const PixelFormat &format);
|
static uint32_t drmToV4L2(const PixelFormat &format);
|
||||||
|
|
||||||
|
static const std::set<unsigned long> supportedIoctls_;
|
||||||
|
|
||||||
unsigned int refcount_;
|
unsigned int refcount_;
|
||||||
unsigned int index_;
|
unsigned int index_;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue