summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlain Volmat <alain.volmat@foss.st.com>2023-11-13 11:08:51 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2023-11-21 11:46:03 +0200
commit882d04d740eec4176d5639a30ac282b89ed49d10 (patch)
treec10eb706ca8f89fe6251e30e8e95df7c0a748880
parent34b248c88f3ab67f47e64a6eab0a784e43f40488 (diff)
libcamera: camera_sensor: Only access V4L_CID_HBLANK if existing
Correct a crash in CameraSensor::init() when trying to set the V4L2_CID_HBLANK control on sensor not implementing this control. The HBLANK sensor not being mandatory for non-RAW sensors, it can happen that the sensor does not expose this control. Perform check against availability of the control prior to usage in order to avoid the crash. Signed-off-by: Alain Volmat <alain.volmat@foss.st.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/libcamera/camera_sensor.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index d9261672..0ef78d9c 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -197,17 +197,19 @@ int CameraSensor::init()
* \todo The control API ought to have a flag to specify if a control
* is read-only which could be used below.
*/
- const ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK);
- const int32_t hblankMin = hblank.min().get<int32_t>();
- const int32_t hblankMax = hblank.max().get<int32_t>();
-
- if (hblankMin != hblankMax) {
- ControlList ctrl(subdev_->controls());
-
- ctrl.set(V4L2_CID_HBLANK, hblankMin);
- ret = subdev_->setControls(&ctrl);
- if (ret)
- return ret;
+ if (ctrls.infoMap()->find(V4L2_CID_HBLANK) != ctrls.infoMap()->end()) {
+ const ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK);
+ const int32_t hblankMin = hblank.min().get<int32_t>();
+ const int32_t hblankMax = hblank.max().get<int32_t>();
+
+ if (hblankMin != hblankMax) {
+ ControlList ctrl(subdev_->controls());
+
+ ctrl.set(V4L2_CID_HBLANK, hblankMin);
+ ret = subdev_->setControls(&ctrl);
+ if (ret)
+ return ret;
+ }
}
return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff);