Commit 4ee23621 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

media: v4l2-fwnode: suppress a warning at OF parsing logic

smatch produce this warning:
	drivers/media/v4l2-core/v4l2-fwnode.c:76 v4l2_fwnode_endpoint_parse_csi_bus() error: buffer overflow 'array' 5 <= u16max

That's because, in thesis, the routine might have called with
some value at bus->num_data_lanes. That's not the current
case.

Yet, better to shut up this warning, and make the code more
reliable if some future changes might cause a bug.

While here, simplify the code a little bit by reading only
once from lanes-properties array.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 1ad371de
...@@ -48,10 +48,9 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode, ...@@ -48,10 +48,9 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode,
rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0); rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0);
if (rval > 0) { if (rval > 0) {
u32 array[ARRAY_SIZE(bus->data_lanes)]; u32 array[MAX_DATA_LANES + 1];
bus->num_data_lanes = bus->num_data_lanes = min_t(int, MAX_DATA_LANES, rval);
min_t(int, ARRAY_SIZE(bus->data_lanes), rval);
fwnode_property_read_u32_array(fwnode, "data-lanes", array, fwnode_property_read_u32_array(fwnode, "data-lanes", array,
bus->num_data_lanes); bus->num_data_lanes);
...@@ -64,25 +63,22 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode, ...@@ -64,25 +63,22 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode,
bus->data_lanes[i] = array[i]; bus->data_lanes[i] = array[i];
} }
}
rval = fwnode_property_read_u32_array(fwnode, "lane-polarities", NULL, rval = fwnode_property_read_u32_array(fwnode,
0); "lane-polarities", array,
1 + bus->num_data_lanes);
if (rval > 0) { if (rval > 0) {
u32 array[ARRAY_SIZE(bus->lane_polarities)]; if (rval != 1 + bus->num_data_lanes /* clock + data */) {
pr_warn("invalid number of lane-polarities entries (need %u, got %u)\n",
if (rval < 1 + bus->num_data_lanes /* clock + data */) {
pr_warn("too few lane-polarities entries (need %u, got %u)\n",
1 + bus->num_data_lanes, rval); 1 + bus->num_data_lanes, rval);
return -EINVAL; return -EINVAL;
} }
fwnode_property_read_u32_array(fwnode, "lane-polarities", array,
1 + bus->num_data_lanes);
for (i = 0; i < 1 + bus->num_data_lanes; i++) for (i = 0; i < 1 + bus->num_data_lanes; i++)
bus->lane_polarities[i] = array[i]; bus->lane_polarities[i] = array[i];
} }
}
if (!fwnode_property_read_u32(fwnode, "clock-lanes", &v)) { if (!fwnode_property_read_u32(fwnode, "clock-lanes", &v)) {
if (lanes_used & BIT(v)) if (lanes_used & BIT(v))
......
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
struct fwnode_handle; struct fwnode_handle;
#define MAX_DATA_LANES 4
/** /**
* struct v4l2_fwnode_bus_mipi_csi2 - MIPI CSI-2 bus data structure * struct v4l2_fwnode_bus_mipi_csi2 - MIPI CSI-2 bus data structure
* @flags: media bus (V4L2_MBUS_*) flags * @flags: media bus (V4L2_MBUS_*) flags
...@@ -37,10 +39,10 @@ struct fwnode_handle; ...@@ -37,10 +39,10 @@ struct fwnode_handle;
*/ */
struct v4l2_fwnode_bus_mipi_csi2 { struct v4l2_fwnode_bus_mipi_csi2 {
unsigned int flags; unsigned int flags;
unsigned char data_lanes[4]; unsigned char data_lanes[MAX_DATA_LANES];
unsigned char clock_lane; unsigned char clock_lane;
unsigned short num_data_lanes; unsigned short num_data_lanes;
bool lane_polarities[5]; bool lane_polarities[MAX_DATA_LANES + 1];
}; };
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment