From 382fb7db52b6296f898e317e7b9e10ab00f5aed3 Mon Sep 17 00:00:00 2001 From: Simon Marchetto Date: Tue, 29 Oct 2013 16:24:31 +0100 Subject: [PATCH] external_objects_java: fix crash on ScilabJavaEnvironment when used as a local variable Fix: ScilabJavaEnvironment::getInstance() returns a pointer on instance, not the instance itself + return Scilab error when instance is null Change-Id: I0645534db16ed489a59360fd6a310ae66e4a9657 --- .../sci_gateway/cpp/sci_jallowClassReloading.cpp | 10 +++++++++- .../sci_gateway/cpp/sci_jautoTranspose.cpp | 9 ++++++++- .../sci_gateway/cpp/sci_jautoUnwrap.cpp | 9 ++++++++- .../sci_gateway/cpp/sci_jconvMatrixMethod.cpp | 2 +- .../src/cpp/ScilabJavaEnvironment.hxx | 4 ++-- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jallowClassReloading.cpp b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jallowClassReloading.cpp index 21c5547..a8635fb 100644 --- a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jallowClassReloading.cpp +++ b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jallowClassReloading.cpp @@ -27,7 +27,15 @@ int sci_jallowClassReloading(char * fname, unsigned long fname_len) try { const int envId = ScilabJavaEnvironment::start(); - JavaOptionsSetter setter = ScilabJavaEnvironment::getInstance().getOptionsHelper().getSetter(JavaOptionsSetter::ALLOWRELOAD); + + ScilabJavaEnvironment *javaEnvironment = ScilabJavaEnvironment::getInstance(); + if (!javaEnvironment) + { + Scierror(999, "%s: No Java environment available (instance is null).", fname); + return 0; + } + + JavaOptionsSetter setter = javaEnvironment->getOptionsHelper().getSetter(JavaOptionsSetter::ALLOWRELOAD); return ScilabGateway::getsetOptions(fname, envId, setter, pvApiCtx); } catch (std::exception & e) diff --git a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jautoTranspose.cpp b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jautoTranspose.cpp index 6fd4a18..bad319e 100644 --- a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jautoTranspose.cpp +++ b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jautoTranspose.cpp @@ -27,7 +27,14 @@ int sci_jautoTranspose(char * fname, unsigned long fname_len) try { const int envId = ScilabJavaEnvironment::start(); - JavaOptionsSetter setter = ScilabJavaEnvironment::getInstance().getOptionsHelper().getSetter(JavaOptionsSetter::METHODOFCONV); + ScilabJavaEnvironment *javaEnvironment = ScilabJavaEnvironment::getInstance(); + if (!javaEnvironment) + { + Scierror(999, "%s: No Java environment available (instance is null).", fname); + return 0; + } + + JavaOptionsSetter setter = javaEnvironment->getOptionsHelper().getSetter(JavaOptionsSetter::METHODOFCONV); return ScilabGateway::getsetOptions(fname, envId, setter, pvApiCtx); } catch (std::exception & e) diff --git a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jautoUnwrap.cpp b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jautoUnwrap.cpp index 1d6e296..0202cae 100644 --- a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jautoUnwrap.cpp +++ b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jautoUnwrap.cpp @@ -27,7 +27,14 @@ int sci_jautoUnwrap(char * fname, unsigned long fname_len) try { const int envId = ScilabJavaEnvironment::start(); - JavaOptionsSetter setter = ScilabJavaEnvironment::getInstance().getOptionsHelper().getSetter(JavaOptionsSetter::AUTOUNWRAP); + ScilabJavaEnvironment *javaEnvironment = ScilabJavaEnvironment::getInstance(); + if (!javaEnvironment) + { + Scierror(999, "%s: No Java environment available (instance is null).", fname); + return 0; + } + + JavaOptionsSetter setter = javaEnvironment->getOptionsHelper().getSetter(JavaOptionsSetter::AUTOUNWRAP); return ScilabGateway::getsetOptions(fname, envId, setter, pvApiCtx); } catch (std::exception & e) diff --git a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jconvMatrixMethod.cpp b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jconvMatrixMethod.cpp index db72e08..5a87f93 100644 --- a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jconvMatrixMethod.cpp +++ b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jconvMatrixMethod.cpp @@ -38,7 +38,7 @@ int sci_jconvMatrixMethod(char * fname, unsigned long fname_len) } envId = ScilabJavaEnvironment::start(); - JavaOptionsSetter setter = ScilabJavaEnvironment::getInstance().getOptionsHelper().getSetter(JavaOptionsSetter::METHODOFCONV); + JavaOptionsSetter setter = ScilabJavaEnvironment::getInstance()->getOptionsHelper().getSetter(JavaOptionsSetter::METHODOFCONV); ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId); ScilabGatewayOptions & options = env.getGatewayOptions(); OptionsHelper::setCopyOccurred(false); diff --git a/scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironment.hxx b/scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironment.hxx index f522baf..6bcb112 100644 --- a/scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironment.hxx +++ b/scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironment.hxx @@ -128,9 +128,9 @@ public : static void finish(); - static ScilabJavaEnvironment & getInstance() + static ScilabJavaEnvironment* getInstance() { - return *instance; + return instance; } JavaOptionsHelper & getOptionsHelper(); -- 1.7.9.5