From ed5f0c42d98b2d6d6fba701b670a2ec1864cb1a5 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sat, 14 Nov 2020 19:37:04 +0100 Subject: [PATCH] Fix off-by-one error in speaker arrangement read This is why you don't do pointer arithmetic. Fixes an error message in Renoise when trying to load a plugin as an effect. --- CHANGELOG.md | 7 +++++++ src/common/serialization.cpp | 13 +++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59089e83..16f82a94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Fixed + +- Fixed an issue where _Renoise_ would show an error message when trying to load + a plugin in the mixer. + ## [2.0.2] - 2020-11-14 ### Fixed diff --git a/src/common/serialization.cpp b/src/common/serialization.cpp index cb9662d3..a764a7e7 100644 --- a/src/common/serialization.cpp +++ b/src/common/serialization.cpp @@ -31,7 +31,9 @@ VstEvents& DynamicVstEvents::as_c_events() { // First we need to allocate enough memory for the entire object. The events // are stored as pointers to objects in the `events` vector that we sent - // over the socket. + // over the socket. Our definition of `VstEvents` contains a single + // `VstEvent`, so our buffer needs to be large enough to store that plus the + // number of events minus one pointers. static_assert(std::extent_v == 1); const size_t buffer_size = sizeof(VstEvents) + ((events.size() - 1) * sizeof(VstEvent*)); @@ -52,15 +54,10 @@ DynamicSpeakerArrangement::DynamicSpeakerArrangement( const VstSpeakerArrangement& speaker_arrangement) : flags(speaker_arrangement.flags), speakers(speaker_arrangement.num_speakers) { - using speaker_type = - std::remove_extent_t; - static_assert(std::is_same_v); - // Copy from the C-style array into a vector for serialization speakers.assign( - speaker_arrangement.speakers, - speaker_arrangement.speakers + - (speaker_arrangement.num_speakers * sizeof(speaker_type))); + &speaker_arrangement.speakers[0], + &speaker_arrangement.speakers[speaker_arrangement.num_speakers]); } VstSpeakerArrangement& DynamicSpeakerArrangement::as_c_speaker_arrangement() {