diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 51d4ed6a91..ee2189d725 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -2118,17 +2118,21 @@ Session::load_routes (const XMLNode& node, int version) std::shared_ptr route; - if (version < 3000) { - route = XMLRouteFactory_2X (**niter, version); - } else if (version < 5000) { - route = XMLRouteFactory_3X (**niter, version); - } else { - route = XMLRouteFactory (**niter, version); + try { + if (version < 3000) { + route = XMLRouteFactory_2X (**niter, version); + } else if (version < 5000) { + route = XMLRouteFactory_3X (**niter, version); + } else { + route = XMLRouteFactory (**niter, version); + } + } catch (...) { + goto errout; } if (route == 0) { error << _("Session: cannot create track/bus from XML description.") << endmsg; - return -1; + goto errout; } BootMessage (string_compose (_("Loaded track/bus %1"), route->name())); @@ -2153,6 +2157,12 @@ Session::load_routes (const XMLNode& node, int version) BootMessage (_("Finished adding tracks/busses")); return 0; + +errout: + for (auto const& r : new_routes) { + r->drop_references (); + } + return -1; } std::shared_ptr