From 38f26697d6998845bacb1d44a92efe8f326a4820 Mon Sep 17 00:00:00 2001 From: Christoph Egger Date: Mon, 25 May 2015 07:37:00 +0200 Subject: [PATCH] Do proper errorhandling for fileload Sharing code with evaluation of strings, now proper error handling is done and frida won't crash if an invalid scheme file is loaded. --- src/bindings/Guile.cxx | 34 +++++++++++++++++++++++----------- src/bindings/Guile.hxx | 6 ++++++ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/bindings/Guile.cxx b/src/bindings/Guile.cxx index d4295c4..863c9cc 100644 --- a/src/bindings/Guile.cxx +++ b/src/bindings/Guile.cxx @@ -32,14 +32,14 @@ GuileInterpreter::GuileInterpreter() LOG4CXX_INFO(logger, "Initializing GUILE finished"); } -int GuileInterpreter::evaluate(const std::string& command, - std::ostream& stdout, - std::ostream& stderr, - std::string& result) { - +int GuileInterpreter::evaluateWithErrorHandling(SCM (*fun)(void *), + void* data, + std::ostream& stdout, + std::ostream& stderr, + std::string& result) { SCM result_obj = scm_internal_catch(SCM_BOOL_T, - (SCM (*)(void *))scm_c_eval_string, - (void*)command.c_str(), + fun, + data, handler, NULL); SCM result_str = scm_object_to_string(result_obj, SCM_UNDEFINED); @@ -54,16 +54,28 @@ int GuileInterpreter::evaluate(const std::string& command, scm_truncate_file(guile_output_port, scm_from_uint16(0)); scm_truncate_file(guile_error_port, scm_from_uint16(0)); - return 0; } +int GuileInterpreter::evaluate(const std::string& command, + std::ostream& stdout, + std::ostream& stderr, + std::string& result) { + + return evaluateWithErrorHandling((SCM (*)(void *))scm_c_eval_string, + (void*)command.c_str(), + stdout, stderr, result); + +} + int GuileInterpreter::loadFile(const std::string& filename, std::ostream& stdout, std::ostream& stderr, std::string& result) { - LOG4CXX_INFO(logger, "Loading file \"" << filename << "\""); - scm_c_primitive_load(filename.c_str()); - LOG4CXX_INFO(logger, "Finished file \"" << filename << "\""); + LOG4CXX_DEBUG(logger, "Loading file \"" << filename << "\""); + evaluateWithErrorHandling((SCM (*)(void *))scm_c_primitive_load, + (void*)filename.c_str(), + stdout, stderr, result); + LOG4CXX_DEBUG(logger, "Finished file \"" << filename << "\""); return 0; } diff --git a/src/bindings/Guile.hxx b/src/bindings/Guile.hxx index 942b04f..612f33b 100644 --- a/src/bindings/Guile.hxx +++ b/src/bindings/Guile.hxx @@ -25,6 +25,12 @@ public: std::string fileExtension() const {return "scm";} private: + int evaluateWithErrorHandling(SCM (*fun)(void *), + void* data, + std::ostream& stdout, + std::ostream& stderr, + std::string& result); + SCM guile_output_port; SCM guile_error_port; log4cxx::LoggerPtr logger; -- 2.39.2