summaryrefslogtreecommitdiff
path: root/src/libcamera/ipa_module.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcamera/ipa_module.cpp')
-rw-r--r--src/libcamera/ipa_module.cpp20
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)) {