[libcamera-devel] [PATCH 2/2] libcamera: controls: Avoid exception in ControlList count() and find()

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Oct 25 23:32:55 CEST 2019


The ControlList count() and find() methods use at() to lookup the
control numerical ID in the idmap_. This causes an exception to be
thrown if the ID doesn't exist in the map. Fix it by using the find()
method instead.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/libcamera/controls.cpp | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 93ad2fc6a276..0c7cd449ad64 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -491,7 +491,11 @@ const ControlInfoMap::mapped_type &ControlInfoMap::at(unsigned int id) const
  */
 ControlInfoMap::size_type ControlInfoMap::count(unsigned int id) const
 {
-	return count(idmap_.at(id));
+	auto iter = idmap_.find(id);
+	if (iter == idmap_.end())
+		return 0;
+
+	return count(iter->second);
 }
 
 /**
@@ -502,7 +506,11 @@ ControlInfoMap::size_type ControlInfoMap::count(unsigned int id) const
  */
 ControlInfoMap::iterator ControlInfoMap::find(unsigned int id)
 {
-	return find(idmap_.at(id));
+	auto iter = idmap_.find(id);
+	if (iter == idmap_.end())
+		return end();
+
+	return find(iter->second);
 }
 
 /**
@@ -513,7 +521,11 @@ ControlInfoMap::iterator ControlInfoMap::find(unsigned int id)
  */
 ControlInfoMap::const_iterator ControlInfoMap::find(unsigned int id) const
 {
-	return find(idmap_.at(id));
+	auto iter = idmap_.find(id);
+	if (iter == idmap_.end())
+		return end();
+
+	return find(iter->second);
 }
 
 /**
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list