libcamera: ipa_manager: Fix handling of unset LIBCAMERA_IPA_MODULE_PATH

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 <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund
2019-06-10 15:37:25 +02:00
parent d9a468aaac
commit cefe067c5b

View File

@@ -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;
addDir(path.c_str());
if (count) {
std::string path(modulePaths, count);
addDir(path.c_str());
}
if (*delim == '\0')
break;
modulePaths += count + 1;
}
}