From 7681d30ac0b9246605d3d8d71dc7e25030748ec6 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 14 May 2022 21:30:31 +0100 Subject: [PATCH 1/3] Fix memory corruption, related to unitialized currentPlay Signed-off-by: falkTX --- src/controller/Sequencer.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/controller/Sequencer.cpp b/src/controller/Sequencer.cpp index 23aceb1..a698e9b 100644 --- a/src/controller/Sequencer.cpp +++ b/src/controller/Sequencer.cpp @@ -56,8 +56,6 @@ SequencerModule::SequencerModule() { } } - doReset(); - configParam(PULSE_WIDTH, 0.1, 10.0, 5.05, "Width", "%"); configParam(PLAY, 0.0f, 1.0f, 0.0f, "Run"); configParam(CYCLE, 0.0f, 1.0f, 0.0f, "Cycle"); @@ -65,14 +63,17 @@ SequencerModule::SequencerModule() { configParam(MAIN_DOWN, 0.0f, 1.0f, 0.0f, "Down"); configParam(COPY, 0.0f, 1.0f, 0.0f, "Copy"); configParam(PASTE, 0.0f, 1.0f, 0.0f, "Paste"); + + doReset(); } void SequencerModule::doReset() { currentCount = -1; - savePattern(currentPlay); - setPlay(programs[0]); currentGate = -1; + currentPlay = 1; currentPosition = 0; + savePattern(currentPlay); + setPlay(programs[0]); } json_t *SequencerModule::dataToJson() { From d44b52e9bf8915c06382bfd1a41a460bafbfd671 Mon Sep 17 00:00:00 2001 From: falkTX Date: Wed, 7 Sep 2022 07:54:03 +0100 Subject: [PATCH 2/3] Fix memory leaks Signed-off-by: falkTX --- deps/LFO.cpp | 4 ++++ deps/LFO.hpp | 1 + src/controller/Baronial.cpp | 4 ++++ src/controller/Baronial.hpp | 1 + src/controller/Gnome.cpp | 6 ++++++ src/controller/Gnome.hpp | 1 + src/controller/Marionette.cpp | 4 ++++ src/controller/Marionette.hpp | 1 + src/controller/OpenHH.cpp | 5 +++++ src/controller/OpenHH.hpp | 1 + src/controller/SBD.cpp | 5 +++++ src/controller/SBD.hpp | 1 + src/controller/SampleController.cpp | 5 +++++ src/controller/SampleController.hpp | 1 + src/controller/Sequencer.cpp | 17 +++++++++++++++++ src/controller/Sequencer.hpp | 1 + 16 files changed, 58 insertions(+) diff --git a/deps/LFO.cpp b/deps/LFO.cpp index 4beb991..8382536 100644 --- a/deps/LFO.cpp +++ b/deps/LFO.cpp @@ -19,6 +19,10 @@ LowFrequencyOscillator::LowFrequencyOscillator() { srand(time(NULL)); } +LowFrequencyOscillator::~LowFrequencyOscillator() { + delete cv; +} + void LowFrequencyOscillator::setPitch(float pitch) { pitch = fminf(pitch, 8.0); freq = powf(2.0, pitch); diff --git a/deps/LFO.hpp b/deps/LFO.hpp index 75c8de1..139ad84 100644 --- a/deps/LFO.hpp +++ b/deps/LFO.hpp @@ -18,6 +18,7 @@ class LowFrequencyOscillator { public: LowFrequencyOscillator(); + ~LowFrequencyOscillator(); void setPitch(float); void setFrequency(float); void setPulseWidth(float); diff --git a/src/controller/Baronial.cpp b/src/controller/Baronial.cpp index 755517e..45ed95f 100644 --- a/src/controller/Baronial.cpp +++ b/src/controller/Baronial.cpp @@ -26,6 +26,10 @@ BaronialModule::BaronialModule() { configParam(RELEASE_CURVE_PARAM, 0.0, 1.0, 1.0); } +BaronialModule::~BaronialModule() { + delete gate; +} + void BaronialModule::process(const ProcessArgs &args) { if (inputs[GATE].isConnected()) { gate->update(inputs[GATE].getVoltage()); diff --git a/src/controller/Baronial.hpp b/src/controller/Baronial.hpp index c94eb72..dee2a1f 100644 --- a/src/controller/Baronial.hpp +++ b/src/controller/Baronial.hpp @@ -13,6 +13,7 @@ struct BaronialModule : Module { enum LightIds { NUM_LIGHTS }; BaronialModule(); + ~BaronialModule() override; float paramValue (uint16_t, uint16_t, float, float); void process(const ProcessArgs &args) override; diff --git a/src/controller/Gnome.cpp b/src/controller/Gnome.cpp index 2f4d9b4..7517b37 100644 --- a/src/controller/Gnome.cpp +++ b/src/controller/Gnome.cpp @@ -16,6 +16,12 @@ GnomeModule::GnomeModule () { doReset(); } +GnomeModule::~GnomeModule() { + delete reset; + delete runCV; + delete runParam; +} + void GnomeModule::doReset() { bpm = 0; width = 0; diff --git a/src/controller/Gnome.hpp b/src/controller/Gnome.hpp index e1a089c..7ef0282 100644 --- a/src/controller/Gnome.hpp +++ b/src/controller/Gnome.hpp @@ -10,6 +10,7 @@ struct GnomeModule : Module { enum LightIds { LED_1, LED_2, LED_4, LED_8, LED_16, LED_A, LED_B, LED_C, LED_D, LED_E, LED_F, LED_RESET, RUN_LIGHT, NUM_LIGHTS }; GnomeModule( ); + ~GnomeModule(); float paramValue (uint16_t, uint16_t, float, float); void process(const ProcessArgs &args) override; diff --git a/src/controller/Marionette.cpp b/src/controller/Marionette.cpp index 398bd4d..9eaf291 100644 --- a/src/controller/Marionette.cpp +++ b/src/controller/Marionette.cpp @@ -28,6 +28,10 @@ MarionetteModule::MarionetteModule( ) { freqAdsr.setDecayCurve(CURVED); } +MarionetteModule::~MarionetteModule() { + delete gate; +} + float MarionetteModule::paramValue (uint16_t param, uint16_t input, float low, float high) { float current = params[param].getValue(); diff --git a/src/controller/Marionette.hpp b/src/controller/Marionette.hpp index 1c481bf..dee2f6d 100644 --- a/src/controller/Marionette.hpp +++ b/src/controller/Marionette.hpp @@ -45,6 +45,7 @@ struct MarionetteModule : Module { enum LightIds { NUM_LIGHTS }; MarionetteModule(); + ~MarionetteModule() override; void process(const ProcessArgs &) override; float pitchEnvelope ( ); diff --git a/src/controller/OpenHH.cpp b/src/controller/OpenHH.cpp index 1aecc37..7b8b3ba 100644 --- a/src/controller/OpenHH.cpp +++ b/src/controller/OpenHH.cpp @@ -31,6 +31,11 @@ OpenHHModule::OpenHHModule( ) { chokeCV[1] = new SynthDevKit::CV(0.5); } +OpenHHModule::~OpenHHModule() { + delete chokeCV[0]; + delete chokeCV[1]; +} + float OpenHHModule::chokeValue(uint8_t which, uint32_t sampleRate) { if (choking[which] == false) { return 1; diff --git a/src/controller/OpenHH.hpp b/src/controller/OpenHH.hpp index 263eb5b..356e7da 100644 --- a/src/controller/OpenHH.hpp +++ b/src/controller/OpenHH.hpp @@ -3,6 +3,7 @@ struct OpenHHModule : SampleController { OpenHHModule(); + ~OpenHHModule() override; void setupSamples( ) override; uint8_t sampleId(uint8_t) override; float chokeValue(uint8_t, uint32_t); diff --git a/src/controller/SBD.cpp b/src/controller/SBD.cpp index 567f895..fcf9bc7 100644 --- a/src/controller/SBD.cpp +++ b/src/controller/SBD.cpp @@ -16,6 +16,11 @@ SBDModule::SBDModule( ) { configParam(SBDModule::WAVE_PARAM, 0.0, 1.0, 1.0, "Wave"); } +SBDModule::~SBDModule() { + delete cv; + delete noise; +} + void SBDModule::process(const ProcessArgs &args) { float noiseVal = 0.0f; float freq_decay = params[PITCH_DECAY_PARAM].getValue(); diff --git a/src/controller/SBD.hpp b/src/controller/SBD.hpp index 6339cd9..56d67bb 100644 --- a/src/controller/SBD.hpp +++ b/src/controller/SBD.hpp @@ -15,6 +15,7 @@ struct SBDModule : Module { enum LightIds { NUM_LIGHTS }; SBDModule( ); + ~SBDModule() override; void process(const ProcessArgs &) override; LowFrequencyOscillator lfo; diff --git a/src/controller/SampleController.cpp b/src/controller/SampleController.cpp index b1d56e2..69f80af 100644 --- a/src/controller/SampleController.cpp +++ b/src/controller/SampleController.cpp @@ -9,6 +9,11 @@ SampleController::SampleController( ) { numModules = 0; } +SampleController::~SampleController() { + for (uint8_t i = 0; i < MAX_MODULES; i++) + delete cv[i]; +} + float SampleController::paramValue (uint16_t param, uint16_t input, float low, float high) { float current = params[param].getValue(); diff --git a/src/controller/SampleController.hpp b/src/controller/SampleController.hpp index dddfd71..6fc61da 100644 --- a/src/controller/SampleController.hpp +++ b/src/controller/SampleController.hpp @@ -16,6 +16,7 @@ struct SampleController : Module { enum LightIds { NUM_LIGHTS }; SampleController( ); + ~SampleController() override; void process(const ProcessArgs &) override; float paramValue (uint16_t, uint16_t, float, float); virtual void setupSamples( ); diff --git a/src/controller/Sequencer.cpp b/src/controller/Sequencer.cpp index a698e9b..ee756b6 100644 --- a/src/controller/Sequencer.cpp +++ b/src/controller/Sequencer.cpp @@ -67,6 +67,23 @@ SequencerModule::SequencerModule() { doReset(); } +SequencerModule::~SequencerModule() { + delete clock; + delete runCV; + delete runParam; + delete cycleCV; + delete cycleParam; + delete resetCV; + delete mainUp; + delete mainDown; + delete copy; + delete paste; + for (int i = 0; i < SEQ_PLAY; i++) { + delete patternUp[i]; + delete patternDown[i]; + } +} + void SequencerModule::doReset() { currentCount = -1; currentGate = -1; diff --git a/src/controller/Sequencer.hpp b/src/controller/Sequencer.hpp index e285586..99a578c 100644 --- a/src/controller/Sequencer.hpp +++ b/src/controller/Sequencer.hpp @@ -48,6 +48,7 @@ struct SequencerModule : Module { }; SequencerModule( ); + ~SequencerModule() override; void process(const ProcessArgs &) override; json_t *dataToJson() override; From f2a7d717e2ae066ba0127fa5ffade775baba1512 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 26 Nov 2022 10:14:35 +0000 Subject: [PATCH 3/3] Fix out of bounds read Signed-off-by: falkTX --- src/model/SampleManager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/model/SampleManager.cpp b/src/model/SampleManager.cpp index 9322403..011b35b 100644 --- a/src/model/SampleManager.cpp +++ b/src/model/SampleManager.cpp @@ -40,6 +40,10 @@ namespace DrumKit { mantissa = modf(ctx->currentPosition, &characteristic); + if ((uint64_t) characteristic == 0) { + return 0.0f; + } + if (mantissa == 0) { return ctx->sample->values[(uint64_t) characteristic - 1]; }