From 08287e76e57579ac11bebdf57d0984b7fd056297 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 21 Aug 2016 19:09:31 +0200 Subject: [PATCH] Fixed a crash in a constructor of FullPrintConfig due to an incorrect use of virtual inheritance. Note that an invocation of ConfigBase::optptr() is routed to FullPrintConfig::optptr() for all classes of the FullPrintConfig hierarchy. FullPrintConfig::optptr() in turn invokes optptr() of PrintObjectConfig, PrintRegionConfig, PrintConfig and HostConfig. Due to the use of virtual inheritance, this all happens, when PrintObjectConfig gets constructed as part of FullPrintConfig, but at that time PrintRegionConfig, PrintConfig and HostConfig are not constructed yet. Accessing them at that time leads to crashes, when compiled with Visual Studio 2013 compiler. For some reason the code generated by gcc does not crash, but I believe the behavior is undefined and it is better to be fixed anyway. The patch solves the problem by calling set_defaults() by the topmost object, which not only fixes the crashes, but also avoids repeated initialization. Conflicts: xs/src/libslic3r/PrintConfig.hpp --- xs/src/libslic3r/PrintConfig.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xs/src/libslic3r/PrintConfig.hpp b/xs/src/libslic3r/PrintConfig.hpp index ef5af261e..8d86bddfe 100644 --- a/xs/src/libslic3r/PrintConfig.hpp +++ b/xs/src/libslic3r/PrintConfig.hpp @@ -163,7 +163,7 @@ class PrintObjectConfig : public virtual StaticPrintConfig if (initialize) this->set_defaults(); } - + virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) { OPT_PTR(dont_support_bridges); OPT_PTR(extrusion_width); @@ -234,7 +234,7 @@ class PrintRegionConfig : public virtual StaticPrintConfig if (initialize) this->set_defaults(); } - + virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) { OPT_PTR(bottom_solid_layers); OPT_PTR(bridge_flow_ratio); @@ -409,7 +409,7 @@ class PrintConfig : public GCodeConfig if (initialize) this->set_defaults(); } - + virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) { OPT_PTR(avoid_crossing_perimeters); OPT_PTR(bed_shape); @@ -482,7 +482,7 @@ class HostConfig : public virtual StaticPrintConfig if (initialize) this->set_defaults(); } - + virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) { OPT_PTR(octoprint_host); OPT_PTR(octoprint_apikey);