From 87533fe4bcb659ebacec6f50ed68070175d4aeda Mon Sep 17 00:00:00 2001 From: John Ralls Date: Fri, 21 Sep 2018 14:28:49 -0700 Subject: [PATCH] Catch std::underflow_error as well as std::overflow_error. Any operation that can overflow will throw an underflow if it's a negative number. The C interface needs to catch both to prevent unhandled exception crashes, --- libgnucash/engine/gnc-numeric.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libgnucash/engine/gnc-numeric.cpp b/libgnucash/engine/gnc-numeric.cpp index ee38dbb746..a2e6c2a49c 100644 --- a/libgnucash/engine/gnc-numeric.cpp +++ b/libgnucash/engine/gnc-numeric.cpp @@ -391,6 +391,13 @@ GncNumeric::to_decimal(unsigned int max_places) const << " overflows when attempting to convert it to decimal.\n"; throw std::range_error(msg.str()); } + catch (const std::underflow_error& err) + { + std::ostringstream msg; + msg << "GncNumeric " << *this + << " underflows when attempting to convert it to decimal.\n"; + throw std::range_error(msg.str()); + } } void @@ -998,6 +1005,10 @@ gnc_numeric_convert(gnc_numeric in, int64_t denom, int how) { return gnc_numeric_error(GNC_ERROR_OVERFLOW); } + catch (const std::underflow_error& err) + { + return gnc_numeric_error(GNC_ERROR_OVERFLOW); + } }