[libcamera-devel] [PATCH v2 1/2] libcamera: base: log: Fix use of freed name

Tomi Valkeinen tomi.valkeinen at ideasonboard.com
Mon Aug 29 10:44:44 CEST 2022


LogCategory just stores the char * that was given to it in the
constructor, i.e. it refers to memory "outside" LogCategory. If the
LogCategory is defined in a .so that is unloaded, then it leads to the
LogCategory pointing to freed memory, causing a crash.

Fix this by taking a copy of the name by using a std::string instead of
just storing the pointer.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 include/libcamera/base/log.h | 4 ++--
 src/libcamera/base/log.cpp   | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
index 3fc5ced3..8b462767 100644
--- a/include/libcamera/base/log.h
+++ b/include/libcamera/base/log.h
@@ -31,14 +31,14 @@ class LogCategory
 public:
 	explicit LogCategory(const char *name);
 
-	const char *name() const { return name_; }
+	const std::string &name() const { return name_; }
 	LogSeverity severity() const { return severity_; }
 	void setSeverity(LogSeverity severity);
 
 	static const LogCategory &defaultCategory();
 
 private:
-	const char *name_;
+	const std::string name_;
 	LogSeverity severity_;
 };
 
diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp
index 5c359a22..a4a5b452 100644
--- a/src/libcamera/base/log.cpp
+++ b/src/libcamera/base/log.cpp
@@ -568,7 +568,7 @@ void Logger::logSetLevel(const char *category, const char *level)
 		return;
 
 	for (LogCategory *c : categories_) {
-		if (!strcmp(c->name(), category)) {
+		if (c->name() == category) {
 			c->setSeverity(severity);
 			break;
 		}
-- 
2.34.1



More information about the libcamera-devel mailing list