summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--src/instance.c16
2 files changed, 10 insertions, 9 deletions
diff --git a/NEWS b/NEWS
index dd41ff6..5306235 100644
--- a/NEWS
+++ b/NEWS
@@ -2,9 +2,10 @@ lilv (0.16.1) unstable;
* Allow lilv_state_restore() to be used without passing an instance,
for restoring port values via a callback only
+ * Fix unlikely memory leak in lilv_plugin_instantiate()
* lilvmm.hpp: Add wrappers for UI API
- -- David Robillard <d@drobilla.net> Tue, 19 Mar 2013 00:01:12 -0400
+ -- David Robillard <d@drobilla.net> Thu, 30 May 2013 19:09:07 -0400
lilv (0.16.0) stable;
diff --git a/src/instance.c b/src/instance.c
index 5fa47fa..ea109d5 100644
--- a/src/instance.c
+++ b/src/instance.c
@@ -31,12 +31,6 @@ lilv_plugin_instantiate(const LilvPlugin* plugin,
LilvInstance* result = NULL;
- const LV2_Feature** local_features = NULL;
- if (features == NULL) {
- local_features = (const LV2_Feature**)malloc(sizeof(LV2_Feature));
- local_features[0] = NULL;
- }
-
const LilvNode* const lib_uri = lilv_plugin_get_library_uri(plugin);
const LilvNode* const bundle_uri = lilv_plugin_get_bundle_uri(plugin);
@@ -56,6 +50,12 @@ lilv_plugin_instantiate(const LilvPlugin* plugin,
return NULL;
}
+ const LV2_Feature** local_features = NULL;
+ if (features == NULL) {
+ local_features = (const LV2_Feature**)malloc(sizeof(LV2_Feature));
+ local_features[0] = NULL;
+ }
+
// Search for plugin by URI
for (uint32_t i = 0; true; ++i) {
const LV2_Descriptor* ld = lilv_lib_get_plugin(lib, i);
@@ -93,6 +93,8 @@ lilv_plugin_instantiate(const LilvPlugin* plugin,
}
}
+ free(local_features);
+
if (result) {
// Failed to instantiate
if (result->lv2_handle == NULL) {
@@ -105,8 +107,6 @@ lilv_plugin_instantiate(const LilvPlugin* plugin,
result->lv2_descriptor->connect_port(result->lv2_handle, i, NULL);
}
- free(local_features);
-
return result;
}