On 03/10/2023 14:08, Sakari Ailus wrote: > On VIDIOC_SUBDEV_[GS]_ROUTING, only return as many routes back to the user > as there's room. Do not consider it an error if more routes existed. > Simply inform the user there are more routes. I'm not convinced by this change. Can userspace do anything useful with only a partially filled routes array? Just silently allowing bad data is asking for problems, IMHO. Regards, Hans > > Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> > --- > .../userspace-api/media/v4l/vidioc-subdev-g-routing.rst | 4 ---- > drivers/media/v4l2-core/v4l2-subdev.c | 8 ++------ > 2 files changed, 2 insertions(+), 10 deletions(-) > > diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-routing.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-routing.rst > index ced53ea5f23c..99d3c15fd759 100644 > --- a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-routing.rst > +++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-routing.rst > @@ -145,10 +145,6 @@ On success 0 is returned, on error -1 and the ``errno`` variable is set > appropriately. The generic error codes are described at the > :ref:`Generic Error Codes <gen-errors>` chapter. > > -ENOSPC > - The application provided ``num_routes`` is not big enough to contain > - all the available routes the subdevice exposes. > - > EINVAL > The sink or source pad identifiers reference a non-existing pad, or reference > pads of different types (ie. the sink_pad identifiers refers to a source pad). > diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c > index 9a34e13dfd96..dd48e7e549fb 100644 > --- a/drivers/media/v4l2-core/v4l2-subdev.c > +++ b/drivers/media/v4l2-core/v4l2-subdev.c > @@ -956,14 +956,10 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg, > > krouting = &state->routing; > > - if (routing->len_routes < krouting->num_routes) { > - routing->num_routes = krouting->num_routes; > - return -ENOSPC; > - } > - > memcpy((struct v4l2_subdev_route *)(uintptr_t)routing->routes, > krouting->routes, > - krouting->num_routes * sizeof(*krouting->routes)); > + min(krouting->num_routes, routing->len_routes) * > + sizeof(*krouting->routes)); > routing->num_routes = krouting->num_routes; > > return 0;