From cefe067c5bdb4098fae3858289d629b74a3d9236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= Date: Mon, 10 Jun 2019 15:37:25 +0200 Subject: libcamera: ipa_manager: Fix handling of unset LIBCAMERA_IPA_MODULE_PATH MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the environment variable LIBCAMERA_IPA_MODULE_PATH is not set utils::secure_getenv() will return a nullptr. Assigning a nullptr to a std::string is not valid and results in a crash, terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid Fix this by operating directly on the returned char array instead of turning it into a std::string. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- src/libcamera/ipa_manager.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'src/libcamera/ipa_manager.cpp') diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp index f689aa69..532b77d3 100644 --- a/src/libcamera/ipa_manager.cpp +++ b/src/libcamera/ipa_manager.cpp @@ -34,19 +34,23 @@ IPAManager::IPAManager() { addDir(IPA_MODULE_DIR); - std::string modulePaths = utils::secure_getenv("LIBCAMERA_IPA_MODULE_PATH"); - if (modulePaths.empty()) + const char *modulePaths = utils::secure_getenv("LIBCAMERA_IPA_MODULE_PATH"); + if (!modulePaths) return; - for (size_t pos = 0, delim = 0; delim != std::string::npos; - pos = delim + 1) { - delim = modulePaths.find(':', pos); - size_t count = delim == std::string::npos ? delim : delim - pos; - std::string path = modulePaths.substr(pos, count); - if (path.empty()) - continue; + while (1) { + const char *delim = strchrnul(modulePaths, ':'); + size_t count = delim - modulePaths; + + if (count) { + std::string path(modulePaths, count); + addDir(path.c_str()); + } + + if (*delim == '\0') + break; - addDir(path.c_str()); + modulePaths += count + 1; } } -- cgit v1.2.1