From b9e61de6668c6450d7b28040519ec2cb3b1ad87f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 17 Nov 2014 06:47:24 +0000 Subject: Fix a few minor/unlikely memory errors. Handle Glade widget loading failure more gracefully. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@5486 a436a847-0d15-0410-975c-d299462d15a1 --- src/LV2Features.cpp | 2 +- src/gui/NodeModule.cpp | 5 +++++ src/gui/Port.cpp | 5 +++++ src/gui/WindowFactory.cpp | 12 ++++++++++++ src/server/ControlBindings.cpp | 1 + src/server/Engine.cpp | 8 ++++---- src/server/ingen_lv2.cpp | 23 +++++++++++++---------- 7 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/LV2Features.cpp b/src/LV2Features.cpp index b3600f02..b6765ae3 100644 --- a/src/LV2Features.cpp +++ b/src/LV2Features.cpp @@ -35,7 +35,7 @@ LV2Features::add_feature(SPtr feature) LV2Features::FeatureArray::FeatureArray(FeatureVector& features) : _features(features) { - _array = (LV2_Feature**)malloc(sizeof(LV2_Feature) * (features.size() + 1)); + _array = (LV2_Feature**)malloc(sizeof(LV2_Feature*) * (features.size() + 1)); _array[features.size()] = NULL; for (size_t i = 0; i < features.size(); ++i) { _array[i] = features[i].get(); diff --git a/src/gui/NodeModule.cpp b/src/gui/NodeModule.cpp index 0bacb70b..722cfa83 100644 --- a/src/gui/NodeModule.cpp +++ b/src/gui/NodeModule.cpp @@ -93,6 +93,11 @@ bool NodeModule::show_menu(GdkEventButton* ev) { WidgetFactory::get_widget_derived("object_menu", _menu); + if (!_menu) { + app().log().error("Failed to load object menu widget\n"); + return false; + } + _menu->init(app(), _block); _menu->signal_embed_gui.connect( sigc::mem_fun(this, &NodeModule::on_embed_gui_toggled)); diff --git a/src/gui/Port.cpp b/src/gui/Port.cpp index e123a571..20f9cf90 100644 --- a/src/gui/Port.cpp +++ b/src/gui/Port.cpp @@ -141,6 +141,11 @@ Port::show_menu(GdkEventButton* ev) { PortMenu* menu = NULL; WidgetFactory::get_widget_derived("object_menu", menu); + if (!menu) { + _app.log().error("Failed to load port menu widget\n"); + return false; + } + menu->init(_app, model(), _flipped); menu->popup(ev->button, ev->time); return true; diff --git a/src/gui/WindowFactory.cpp b/src/gui/WindowFactory.cpp index f6d07262..ebd008e6 100644 --- a/src/gui/WindowFactory.cpp +++ b/src/gui/WindowFactory.cpp @@ -14,8 +14,10 @@ along with Ingen. If not, see . */ +#include #include +#include "ingen/Log.hpp" #include "ingen/client/GraphModel.hpp" #include "App.hpp" @@ -51,6 +53,11 @@ WindowFactory::WindowFactory(App& app) WidgetFactory::get_widget_derived("properties_win", _properties_win); WidgetFactory::get_widget_derived("rename_win", _rename_win); + if (!(_load_plugin_win && _load_graph_win && _new_subgraph_win + && _properties_win && _rename_win)) { + throw std::runtime_error("failed to load window widgets\n"); + } + _load_plugin_win->init_window(app); _load_graph_win->init(app); _new_subgraph_win->init_window(app); @@ -157,6 +164,11 @@ WindowFactory::new_graph_window(SPtr graph, GraphWindow* win = NULL; WidgetFactory::get_widget_derived("graph_win", win); + if (!win) { + _app.log().error("Failed to load graph window widget\n"); + return NULL; + } + win->init_window(_app); win->box()->set_graph(graph, view); diff --git a/src/server/ControlBindings.cpp b/src/server/ControlBindings.cpp index 6ffb5c7d..973874ae 100644 --- a/src/server/ControlBindings.cpp +++ b/src/server/ControlBindings.cpp @@ -339,6 +339,7 @@ ControlBindings::bind(ProcessContext& context, Key key) _bindings->insert(make_pair(key, _learn_port)); uint8_t buf[128]; + memset(buf, 0, sizeof(buf)); lv2_atom_forge_set_buffer(&_forge, buf, sizeof(buf)); forge_binding(uris, &_forge, key.type, key.num); const LV2_Atom* atom = (const LV2_Atom*)buf; diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp index 71573ecb..76755a2c 100644 --- a/src/server/Engine.cpp +++ b/src/server/Engine.cpp @@ -339,11 +339,11 @@ Engine::run(uint32_t sample_count) // Run root graph if (_root_graph) { _root_graph->process(_process_context); - } - // Emit control binding feedback - control_bindings()->post_process( - _process_context, _root_graph->port_impl(1)->buffer(0).get()); + // Emit control binding feedback + control_bindings()->post_process( + _process_context, _root_graph->port_impl(1)->buffer(0).get()); + } return n_processed_events; } diff --git a/src/server/ingen_lv2.cpp b/src/server/ingen_lv2.cpp index e73cc4ee..70642298 100644 --- a/src/server/ingen_lv2.cpp +++ b/src/server/ingen_lv2.cpp @@ -28,6 +28,7 @@ #include "lv2/lv2plug.in/ns/ext/atom/util.h" #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h" #include "lv2/lv2plug.in/ns/ext/log/log.h" +#include "lv2/lv2plug.in/ns/ext/log/logger.h" #include "lv2/lv2plug.in/ns/ext/options/options.h" #include "lv2/lv2plug.in/ns/ext/state/state.h" #include "lv2/lv2plug.in/ns/ext/urid/urid.h" @@ -501,6 +502,17 @@ ingen_instantiate(const LV2_Descriptor* descriptor, } } + LV2_Log_Logger logger; + lv2_log_logger_init(&logger, map, log); + + if (!map) { + lv2_log_error(&logger, "host did not provide URI map feature\n"); + return NULL; + } else if (!unmap) { + lv2_log_error(&logger, "host did not provide URI unmap feature\n"); + return NULL; + } + if (!Glib::thread_supported()) { Glib::thread_init(); } @@ -518,16 +530,7 @@ ingen_instantiate(const LV2_Descriptor* descriptor, } if (!graph) { - const std::string msg((fmt("Could not find graph %1%\n") - % descriptor->URI).str()); - if (log) { - log->printf(log->handle, - map->map(map->handle, LV2_LOG__Error), - msg.c_str(), - NULL); - } else { - std::cerr << msg.c_str() << std::endl; - } + lv2_log_error(&logger, "could not find graph <%s>\n", descriptor->URI); return NULL; } -- cgit v1.2.1