@@ -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) {
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 24c2caa1c1b3 ("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: 24c2caa1c1b3 ("libcamera: base: log: Use `std::string_view` to avoid some copies") Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> --- src/libcamera/base/log.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)