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;
 	}
