From 32f37250d5cbbf3353cad47afdf81afa8d438295 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 4 Jun 2018 10:51:11 +0200 Subject: [PATCH] Catch exception in replaceEnvironmentPath This exception in the regex constructor is only theoretical (our regex are hardcoded), but this is creating coverity noise. Additionally, revert the following commits that are not needed anymore: 6b6fa94c: Catch exceptions to please coverity c2ed75fd: Fixup 6b6fa94c: coverity says there are more possible exceptions. This commit is better viewed with 'git show -b'. --- src/LyX.cpp | 58 ++++++++++++++++++--------------------- src/Server.cpp | 5 +--- src/support/filetools.cpp | 30 ++++++++++++-------- 3 files changed, 46 insertions(+), 47 deletions(-) diff --git a/src/LyX.cpp b/src/LyX.cpp index 0e1b19faf6..4e97f7ae64 100644 --- a/src/LyX.cpp +++ b/src/LyX.cpp @@ -471,45 +471,39 @@ void LyX::earlyExit(int status) int LyX::init(int & argc, char * argv[]) { - try { - // check for any spurious extra arguments - // other than documents - for (int argi = 1; argi < argc ; ++argi) { - if (argv[argi][0] == '-') { - lyxerr << to_utf8( - bformat(_("Wrong command line option `%1$s'. Exiting."), - from_utf8(os::utf8_argv(argi)))) << endl; - return EXIT_FAILURE; - } - } - - // Initialization of LyX (reads lyxrc and more) - LYXERR(Debug::INIT, "Initializing LyX::init..."); - bool success = init(); - LYXERR(Debug::INIT, "Initializing LyX::init...done"); - if (!success) - return EXIT_FAILURE; - // Remaining arguments are assumed to be files to load. - for (int argi = 1; argi < argc; ++argi) - pimpl_->files_to_load_.push_back(os::utf8_argv(argi)); - - if (!use_gui && pimpl_->files_to_load_.empty()) { - lyxerr << to_utf8(_("Missing filename for this operation.")) << endl; + // check for any spurious extra arguments + // other than documents + for (int argi = 1; argi < argc ; ++argi) { + if (argv[argi][0] == '-') { + lyxerr << to_utf8( + bformat(_("Wrong command line option `%1$s'. Exiting."), + from_utf8(os::utf8_argv(argi)))) << endl; return EXIT_FAILURE; } + } - if (first_start) { - pimpl_->files_to_load_.push_back( - i18nLibFileSearch("examples", "splash.lyx").absFileName()); - } + // Initialization of LyX (reads lyxrc and more) + LYXERR(Debug::INIT, "Initializing LyX::init..."); + bool success = init(); + LYXERR(Debug::INIT, "Initializing LyX::init...done"); + if (!success) + return EXIT_FAILURE; - return EXIT_SUCCESS; + // Remaining arguments are assumed to be files to load. + for (int argi = 1; argi < argc; ++argi) + pimpl_->files_to_load_.push_back(os::utf8_argv(argi)); - } catch (exception const &e) { - // This can happen _in_theory_ in replaceEnvironmentPath - lyxerr << "Caught exception `" << e.what() << "'." << endl; + if (!use_gui && pimpl_->files_to_load_.empty()) { + lyxerr << to_utf8(_("Missing filename for this operation.")) << endl; return EXIT_FAILURE; } + + if (first_start) { + pimpl_->files_to_load_.push_back( + i18nLibFileSearch("examples", "splash.lyx").absFileName()); + } + + return EXIT_SUCCESS; } diff --git a/src/Server.cpp b/src/Server.cpp index 5f5d873f54..a83911dc69 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -1067,10 +1067,7 @@ Server::~Server() string message; for (int i = 0; i != numclients_; ++i) { message = "LYXSRV:" + clients_[i] + ":bye\n"; - // ignore exceptions, we are quitting anyway - try { - pipes_.send(message); - } catch (...) {} + pipes_.send(message); } } diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp index 694ae53099..60bd72f905 100644 --- a/src/support/filetools.cpp +++ b/src/support/filetools.cpp @@ -686,19 +686,27 @@ string const replaceEnvironmentPath(string const & path) // $[A-Za-z_][A-Za-z_0-9]* static string const envvar = "[$]([A-Za-z_][A-Za-z_0-9]*)"; - static regex const envvar_br_re("(.*)" + envvar_br + "(.*)"); - static regex const envvar_re("(.*)" + envvar + "(.*)"); - string result = path; - while (1) { - smatch what; - if (!regex_match(result, what, envvar_br_re)) { - if (!regex_match(result, what, envvar_re)) - break; + // Coverity thinks that the regex constructor can return an + // exception. We know that it is not true since our regex are + // hardcoded, but we have to protect against that nevertheless. + try { + static regex const envvar_br_re("(.*)" + envvar_br + "(.*)"); + static regex const envvar_re("(.*)" + envvar + "(.*)"); + string result = path; + while (1) { + smatch what; + if (!regex_match(result, what, envvar_br_re)) { + if (!regex_match(result, what, envvar_re)) + break; + } + string env_var = getEnv(what.str(2)); + result = what.str(1) + env_var + what.str(3); } - string env_var = getEnv(what.str(2)); - result = what.str(1) + env_var + what.str(3); + return result; + } catch (exception const & e) { + LYXERR0("Something is very wrong: " << e.what()); + return path; } - return result; }