summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ipa/rkisp1/rkisp1.cpp2
-rw-r--r--src/ipa/vimc/vimc.cpp2
-rw-r--r--src/libcamera/ipa_module.cpp20
-rw-r--r--test/ipa/ipa_module_test.cpp2
4 files changed, 23 insertions, 3 deletions
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index acbbe58c..7f0ffb0a 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -274,7 +274,7 @@ const struct IPAModuleInfo ipaModuleInfo = {
IPA_MODULE_API_VERSION,
1,
"PipelineHandlerRkISP1",
- "RkISP1 IPA",
+ "rkisp1",
};
struct ipa_context *ipaCreate()
diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp
index d2267e11..cfdbd6f9 100644
--- a/src/ipa/vimc/vimc.cpp
+++ b/src/ipa/vimc/vimc.cpp
@@ -126,7 +126,7 @@ const struct IPAModuleInfo ipaModuleInfo = {
IPA_MODULE_API_VERSION,
0,
"PipelineHandlerVimc",
- "Dummy IPA for Vimc",
+ "vimc",
};
struct ipa_context *ipaCreate()
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)) {
diff --git a/test/ipa/ipa_module_test.cpp b/test/ipa/ipa_module_test.cpp
index d22c302f..e3aee190 100644
--- a/test/ipa/ipa_module_test.cpp
+++ b/test/ipa/ipa_module_test.cpp
@@ -58,7 +58,7 @@ protected:
IPA_MODULE_API_VERSION,
0,
"PipelineHandlerVimc",
- "Dummy IPA for Vimc",
+ "vimc",
};
count += runTest("src/ipa/vimc/ipa_vimc.so", testInfo);