From 9bad0eb50fa61a86637737e18a598bb06513d248 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Thu, 17 Dec 2020 18:27:35 +0100 Subject: [PATCH] Work around bug in Bitwig Studio These FIDStrings are not terminated by null bytes, and thus `FIDStringsEqual` things they don't match any knows IIDs since they appear to have different lengths. --- .../bridges/vst3-impls/plugin-factory.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/plugin/bridges/vst3-impls/plugin-factory.cpp b/src/plugin/bridges/vst3-impls/plugin-factory.cpp index 18793d27..969b0805 100644 --- a/src/plugin/bridges/vst3-impls/plugin-factory.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-factory.cpp @@ -28,14 +28,26 @@ tresult PLUGIN_API YaPluginFactoryImpl::createInstance(Steinberg::FIDString cid, Steinberg::FIDString _iid, void** obj) { + if (!_iid || !cid) { + return Steinberg::kInvalidArgument; + } + ArrayUID cid_array; std::copy(cid, cid + sizeof(Steinberg::TUID), cid_array.begin()); + // FIXME: `_iid` in Bitwig Studio 3.3.1 is not null terminated, and the + // comparison below will thus fail since the strings have different + // lengths. We'll temporarily work around this, and if this end sup + // not being us doing something strange then we should report it. + constexpr size_t uid_size = sizeof(Steinberg::TUID); + std::string iid_string(_iid, uid_size); + Vst3PluginProxy::Construct::Interface requested_interface; - if (Steinberg::FIDStringsEqual(_iid, Steinberg::Vst::IComponent::iid)) { + if (Steinberg::FIDStringsEqual(iid_string.c_str(), + Steinberg::Vst::IComponent::iid)) { requested_interface = Vst3PluginProxy::Construct::Interface::IComponent; } else if (Steinberg::FIDStringsEqual( - _iid, Steinberg::Vst::IEditController::iid)) { + iid_string.c_str(), Steinberg::Vst::IEditController::iid)) { requested_interface = Vst3PluginProxy::Construct::Interface::IEditController; } else { @@ -44,7 +56,6 @@ YaPluginFactoryImpl::createInstance(Steinberg::FIDString cid, // way to convert a `FIDString/char*` into a `FUID`, so this will have // to do. std::optional uid; - constexpr size_t uid_size = sizeof(Steinberg::TUID); if (_iid && strnlen(_iid, uid_size) >= uid_size) { uid = Steinberg::FUID::fromTUID( *reinterpret_cast(&*_iid));