libcamera: base: Fix log level parsing when multiple categories are

listed

For a list of log levels like LIBCAMERA_LOG_LEVELS="CatA:0,CatB:1" only
the severity of the last entry is correctly parsed.

Due to the change of level to a string_view in 24c2caa1c1 ("libcamera:
base: log: Use `std::string_view` to avoid some copies") the level is no
longer necessarily null terminated as it is a view on the original data.

Replace the check for a terminating null by a check for the end position
to fix the issue.

Fixes: 24c2caa1c1 ("libcamera: base: log: Use `std::string_view` to avoid some copies")
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Stefan Klug 2025-06-06 10:21:35 +02:00
parent 8ea3ef083f
commit 0dfb052fbd
2 changed files with 4 additions and 3 deletions

View file

@ -690,8 +690,9 @@ LogSeverity Logger::parseLogLevel(std::string_view level)
unsigned int severity = LogInvalid;
if (std::isdigit(level[0])) {
auto [end, ec] = std::from_chars(level.data(), level.data() + level.size(), severity);
if (ec != std::errc() || *end != '\0' || severity > LogFatal)
const char *levelEnd = level.data() + level.size();
auto [end, ec] = std::from_chars(level.data(), levelEnd, severity);
if (ec != std::errc() || end != levelEnd || severity > LogFatal)
severity = LogInvalid;
} else {
for (unsigned int i = 0; i < std::size(names); ++i) {