diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-04-27 04:09:42 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-04-28 01:54:29 +0300 |
commit | 6e1cd1394e5d73dfd4c4334cbf8beee79072de21 (patch) | |
tree | afb711809804c8c0cde434ca0655f98b04ad1a19 /src/libcamera/ipa_module.cpp | |
parent | 256d0a4098aa4c4e9f87db46cecbd66f693dd9bf (diff) |
ipa: Name IPA modules after their source directory
The IPAModuleInfo::name field is currently a free-formed string that has
little use. Tighten its usage rules to make it suitable for building
file system paths to IPA-specific resources by matching the directory
name of the IPA module.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/libcamera/ipa_module.cpp')
-rw-r--r-- | src/libcamera/ipa_module.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/libcamera/ipa_module.cpp b/src/libcamera/ipa_module.cpp index 958ede74..52823e88 100644 --- a/src/libcamera/ipa_module.cpp +++ b/src/libcamera/ipa_module.cpp @@ -9,6 +9,7 @@ #include <algorithm> #include <array> +#include <ctype.h> #include <dlfcn.h> #include <elf.h> #include <errno.h> @@ -216,6 +217,11 @@ Span<uint8_t> elfLoadSymbol(Span<uint8_t> elf, const char *symbol) * \var IPAModuleInfo::name * \brief The name of the IPA module * + * The name may be used to build file system paths to IPA-specific resources. + * It shall only contain printable characters, and may not contain '/', '*', + * '?' or '\'. For IPA modules included in libcamera, it shall match the + * directory of the IPA module in the source tree. + * * \todo Allow user to choose to isolate open source IPAs */ @@ -287,6 +293,20 @@ int IPAModule::loadIPAModuleInfo() return -EINVAL; } + /* Validate the IPA module name. */ + std::string ipaName = info_.name; + auto iter = std::find_if_not(ipaName.begin(), ipaName.end(), + [](unsigned char c) -> bool { + return isprint(c) && c != '/' && + c != '?' && c != '*' && + c != '\\'; + }); + if (iter != ipaName.end()) { + LOG(IPAModule, Error) + << "Invalid IPA module name '" << ipaName << "'"; + return -EINVAL; + } + /* Load the signature. Failures are not fatal. */ File sign{ libPath_ + ".sign" }; if (!sign.open(File::ReadOnly)) { |