# HG changeset patch # User John W. Eaton # Date 1468600979 14400 # Node ID 5f91c1e89a98eae42da9028d99044fcb8383ee35 # Parent d3b6d0e108a39f099d3e83076277b039dfb348af avoid possible crash in exist function (bug #36067) * variables.cc (Fexist): Check for command line functions before other types of functions. Check for built-in functions last. Instead of using symbol_table::find, which may load .mex or .oct file or parse functions files, use symbol_table::is_built_in_function name to check for built-in functions and symbol_table::find_cmdline_function to check for built-in functions. (safe_symbol_exist): Delete unused function. diff -r d3b6d0e108a3 -r 5f91c1e89a98 libinterp/corefcn/variables.cc --- a/libinterp/corefcn/variables.cc Fri Jul 15 12:09:25 2016 -0400 +++ b/libinterp/corefcn/variables.cc Fri Jul 15 12:42:59 2016 -0400 @@ -366,26 +366,6 @@ %!error isglobal (1) */ -static octave_value -safe_symbol_lookup (const std::string& symbol_name) -{ - octave_value retval; - - octave::unwind_protect frame; - interpreter_try (frame); - - try - { - retval = symbol_table::find (symbol_name); - } - catch (const octave_execution_exception&) - { - recover_from_exception (); - } - - return retval; -} - int symbol_exist (const std::string& name, const std::string& type) { @@ -420,21 +400,13 @@ // We shouldn't need to look in the global symbol table, since any name // that is visible in the current scope will be in the local symbol table. - octave_value val; - - if (search_any || search_builtin) + // Command line function which Matlab does not support + if (search_any) { - // FIXME: safe_symbol_lookup will attempt unsafe load of .oct/.mex file. - // This can cause a segfault. To catch this would require temporarily - // diverting the SIGSEGV exception handler and then restoring it. - // See bug #36067. - val = safe_symbol_lookup (name); - - if (val.is_defined () && val.is_builtin_function ()) - return 5; - - if (search_builtin) - return 0; + octave_value val = symbol_table::find_cmdline_function (name); + + if (val.is_defined ()) + return 103; } if (search_any || search_file || search_dir) @@ -488,9 +460,14 @@ return 0; } - // Command line function which Matlab does not support - if (search_any && val.is_defined () && val.is_user_function ()) - return 103; + if (search_any || search_builtin) + { + if (symbol_table::is_built_in_function_name (name)) + return 5; + + if (search_builtin) + return 0; + } return 0; }