copy LV2 options to heap.
authorRobin Gareus <robin@gareus.org>
Fri, 25 Sep 2015 17:43:43 +0000 (19:43 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 25 Sep 2015 17:44:30 +0000 (19:44 +0200)
Stack pointer becomes invalid when the array goes out of scope.
Fixes rare crash in suil_wrapper_new() or GUIs iterating over options.

libs/ardour/lv2_plugin.cc

index 877a6577cca5a992021ac338c5bc291d52143f04..cd1c190c383b0810fb55a49f66222834d4a5f5f4 100644 (file)
@@ -242,6 +242,7 @@ struct LV2Plugin::Impl {
               , opts_iface(0)
               , state(0)
               , block_length(0)
+              , options(0)
        {}
 
        /** Find the LV2 input port with the given designation.
@@ -261,6 +262,7 @@ struct LV2Plugin::Impl {
        LV2_Atom_Forge               forge;
        LV2_Atom_Forge               ui_forge;
        int32_t                      block_length;
+       LV2_Options_Option*          options;
 };
 
 LV2Plugin::LV2Plugin (AudioEngine& engine,
@@ -385,8 +387,11 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
                { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, NULL }
        };
 
+       _impl->options = (LV2_Options_Option*) malloc (sizeof (options));
+       memcpy ((void*) _impl->options, (void*) options, sizeof (options));
+
        _options_feature.URI    = LV2_OPTIONS__options;
-       _options_feature.data   = options;
+       _options_feature.data   = _impl->options;
        _features[n_features++] = &_options_feature;
 #endif
 
@@ -679,6 +684,7 @@ LV2Plugin::~LV2Plugin ()
        lilv_instance_free(_impl->instance);
        lilv_node_free(_impl->name);
        lilv_node_free(_impl->author);
+       free(_impl->options);
 
        free(_features);
        free(_make_path_feature.data);