commit a03b7f0dc0839ec5a2e27f7c435533c42ba560d0
parent 5aabf491b0d31e5eb151636930f1eb96dff54031
Author: Alexandre BIQUE <bique.alexandre@gmail.com>
Date: Wed, 2 Jun 2021 01:00:29 +0200
More checks
Diffstat:
2 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/examples/plugins/plugin.cc b/examples/plugins/plugin.cc
@@ -296,6 +296,13 @@ namespace clap {
auto &self = from(plugin);
self.ensureMainThread("clap_plugin_params.enum_value");
+ if (!self.isValidParamId(param_id)) {
+ std::ostringstream msg;
+ msg << "clap_plugin_params.enum_value called with invalid param_id: " << param_id;
+ self.hostMisbehaving(msg.str());
+ return false;
+ }
+
// TODO: check the value index?
return self.paramsEnumValue(param_id, value_index, value);
@@ -306,6 +313,13 @@ namespace clap {
auto &self = from(plugin);
self.ensureMainThread("clap_plugin_params.value");
+ if (!self.isValidParamId(param_id)) {
+ std::ostringstream msg;
+ msg << "clap_plugin_params.value called with invalid param_id: " << param_id;
+ self.hostMisbehaving(msg.str());
+ return false;
+ }
+
// TODO extra checks
return self.paramsValue(param_id, value);
@@ -324,6 +338,13 @@ namespace clap {
return false;
}
+ if (!self.isValidParamId(param_id)) {
+ std::ostringstream msg;
+ msg << "clap_plugin_params.set_value called with invalid param_id: " << param_id;
+ self.hostMisbehaving(msg.str());
+ return false;
+ }
+
// TODO: extra checks
return self.paramsSetValue(param_id, value, modulation);
@@ -337,6 +358,13 @@ namespace clap {
auto &self = from(plugin);
self.ensureMainThread("clap_plugin_params.value_to_text");
+ if (!self.isValidParamId(param_id)) {
+ std::ostringstream msg;
+ msg << "clap_plugin_params.value_to_text called with invalid param_id: " << param_id;
+ self.hostMisbehaving(msg.str());
+ return false;
+ }
+
// TODO: extra checks
return self.paramsValueToText(param_id, value, display, size);
}
@@ -348,10 +376,33 @@ namespace clap {
auto &self = from(plugin);
self.ensureMainThread("clap_plugin_params.text_to_value");
+ if (!self.isValidParamId(param_id)) {
+ std::ostringstream msg;
+ msg << "clap_plugin_params.text_to_value called with invalid param_id: " << param_id;
+ self.hostMisbehaving(msg.str());
+ return false;
+ }
+
// TODO: extra checks
return self.paramsTextToValue(param_id, display, value);
}
+ bool Plugin::isValidParamId(clap_id param_id) const noexcept {
+ checkMainThread();
+
+ auto count = paramsCount();
+ clap_param_info info;
+ for (uint32_t i = 0; i < count; ++i) {
+ if (!paramsInfo(i, &info))
+ // TODO: fatal error?
+ continue;
+
+ if (info.id == param_id)
+ return true;
+ }
+ return false;
+ }
+
/////////////
// Logging //
/////////////
@@ -379,7 +430,7 @@ namespace clap {
// Thread Checking //
/////////////////////
- void Plugin::checkMainThread() {
+ void Plugin::checkMainThread() const {
if (!hostThreadCheck_ || !hostThreadCheck_->is_main_thread ||
hostThreadCheck_->is_main_thread(host_))
return;
diff --git a/examples/plugins/plugin.hh b/examples/plugins/plugin.hh
@@ -96,7 +96,7 @@ namespace clap {
/////////////////////
// Thread Checking //
/////////////////////
- void checkMainThread();
+ void checkMainThread() const;
void ensureMainThread(const char *method);
void ensureAudioThread(const char *method);
@@ -112,6 +112,8 @@ namespace clap {
static uint32_t compareAudioPortsInfo(const clap_audio_port_info &a,
const clap_audio_port_info &b) noexcept;
+ virtual bool isValidParamId(clap_id param_id) const noexcept;
+
//////////////////////
// Processing State //
//////////////////////