summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>2022-08-29 11:44:44 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-10-20 02:41:48 +0300
commit662df4ca26cfe9603a2824d31131324c30c8b6bd (patch)
tree9c33fad4ebaaea4b4a9434095061670f79b7c811
parent376adeb7b7e0b75f2fa90b890fe0203d1e268cdf (diff)
libcamera: base: log: Fix use of freed name
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@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--include/libcamera/base/log.h4
-rw-r--r--src/libcamera/base/log.cpp2
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;
}