From ddf52b2a4490fa7a78d2a1b17298d1fdc7a8d077 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Tue, 15 Dec 2020 10:12:46 +0100 Subject: [PATCH] Handle exceptions safely in FUSE driver --- src/dwarfs.cpp | 56 ++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/src/dwarfs.cpp b/src/dwarfs.cpp index c8233f12..1628ec00 100644 --- a/src/dwarfs.cpp +++ b/src/dwarfs.cpp @@ -582,11 +582,7 @@ int run_fuse(struct fuse_args& args, char* mountpoint, int mt, int fg) { #endif -} // namespace dwarfs - -int main(int argc, char* argv[]) { - using namespace dwarfs; - +int run_dwarfs(int argc, char* argv[]) { struct fuse_args args = FUSE_ARGS_INIT(argc, argv); s_opts.progname = argv[0]; @@ -618,28 +614,34 @@ int main(int argc, char* argv[]) { } #endif - // TODO: foreground mode, stderr vs. syslog? - s_opts.debuglevel = s_opts.debuglevel_str - ? logger::parse_level(s_opts.debuglevel_str) - : logger::INFO; + try { + // TODO: foreground mode, stderr vs. syslog? + s_opts.debuglevel = s_opts.debuglevel_str + ? logger::parse_level(s_opts.debuglevel_str) + : logger::INFO; - s_lgr.set_threshold(s_opts.debuglevel); - s_lgr.set_with_context(s_opts.debuglevel >= logger::DEBUG); - LOG_PROXY(debug_logger_policy, s_lgr); + s_lgr.set_threshold(s_opts.debuglevel); + s_lgr.set_with_context(s_opts.debuglevel >= logger::DEBUG); + LOG_PROXY(debug_logger_policy, s_lgr); - s_opts.cachesize = s_opts.cachesize_str - ? parse_size_with_unit(s_opts.cachesize_str) - : (static_cast(512) << 20); - s_opts.workers = - s_opts.workers_str ? folly::to(s_opts.workers_str) : 2; - s_opts.lock_mode = - s_opts.mlock_str ? parse_mlock_mode(s_opts.mlock_str) : mlock_mode::NONE; - s_opts.decompress_ratio = s_opts.decompress_ratio_str - ? folly::to(s_opts.decompress_ratio_str) - : 0.8; + s_opts.cachesize = s_opts.cachesize_str + ? parse_size_with_unit(s_opts.cachesize_str) + : (static_cast(512) << 20); + s_opts.workers = + s_opts.workers_str ? folly::to(s_opts.workers_str) : 2; + s_opts.lock_mode = s_opts.mlock_str ? parse_mlock_mode(s_opts.mlock_str) + : mlock_mode::NONE; + s_opts.decompress_ratio = + s_opts.decompress_ratio_str + ? folly::to(s_opts.decompress_ratio_str) + : 0.8; - LOG_INFO << "dwarfs (" << DWARFS_VERSION << ", fuse version " - << FUSE_USE_VERSION << ")"; + LOG_INFO << "dwarfs (" << DWARFS_VERSION << ", fuse version " + << FUSE_USE_VERSION << ")"; + } catch (runtime_error const& e) { + std::cerr << "error: " << e.what() << std::endl; + return 1; + } if (!s_opts.seen_mountpoint) { usage(s_opts.progname); @@ -653,3 +655,9 @@ int main(int argc, char* argv[]) { return run_fuse(args, mountpoint, mt, fg); #endif } + +} // namespace dwarfs + +int main(int argc, char* argv[]) { + return dwarfs::safe_main([&] { return dwarfs::run_dwarfs(argc, argv); }); +}