From 6c45d2c4795dd3abe12b4f5fd95ec20ae019b90c Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 9 Aug 2018 21:03:21 +0300 Subject: [PATCH] Make BigNum::from_decimal safe. GitOrigin-RevId: bc414c62024d0f971d3400fec738545f898654a4 --- tdutils/td/utils/BigNum.cpp | 8 +++++--- tdutils/td/utils/BigNum.h | 3 ++- tdutils/test/misc.cpp | 15 +++++++++++++++ tdutils/test/pq.cpp | 4 ++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/tdutils/td/utils/BigNum.cpp b/tdutils/td/utils/BigNum.cpp index 6e21b435b..2b6331436 100644 --- a/tdutils/td/utils/BigNum.cpp +++ b/tdutils/td/utils/BigNum.cpp @@ -85,10 +85,12 @@ BigNum BigNum::from_binary(Slice str) { return BigNum(make_unique(BN_bin2bn(str.ubegin(), narrow_cast(str.size()), nullptr))); } -BigNum BigNum::from_decimal(CSlice str) { +Result BigNum::from_decimal(CSlice str) { BigNum result; - int err = BN_dec2bn(&result.impl_->big_num, str.c_str()); - LOG_IF(FATAL, err == 0); + int res = BN_dec2bn(&result.impl_->big_num, str.c_str()); + if (res == 0 || static_cast(res) != str.size()) { + return Status::Error(PSLICE() << "Failed to parse \"" << str << "\" as BigNum"); + } return result; } diff --git a/tdutils/td/utils/BigNum.h b/tdutils/td/utils/BigNum.h index 8de4e5871..a94b16173 100644 --- a/tdutils/td/utils/BigNum.h +++ b/tdutils/td/utils/BigNum.h @@ -11,6 +11,7 @@ #if TD_HAVE_OPENSSL #include "td/utils/Slice.h" +#include "td/utils/Status.h" namespace td { @@ -41,7 +42,7 @@ class BigNum { static BigNum from_binary(Slice str); - static BigNum from_decimal(CSlice str); + static Result from_decimal(CSlice str); static BigNum from_raw(void *openssl_big_num); diff --git a/tdutils/test/misc.cpp b/tdutils/test/misc.cpp index 3a251229a..0280d819c 100644 --- a/tdutils/test/misc.cpp +++ b/tdutils/test/misc.cpp @@ -5,6 +5,7 @@ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "td/utils/base64.h" +#include "td/utils/BigNum.h" #include "td/utils/HttpUrl.h" #include "td/utils/logging.h" #include "td/utils/misc.h" @@ -404,3 +405,17 @@ TEST(Misc, unicode) { test_unicode(unicode_to_lower); test_unicode(remove_diacritics); } + +TEST(BigNum, from_decimal) { + ASSERT_TRUE(BigNum::from_decimal("").is_error()); + ASSERT_TRUE(BigNum::from_decimal("a").is_error()); + ASSERT_TRUE(BigNum::from_decimal("123a").is_error()); + ASSERT_TRUE(BigNum::from_decimal("-123a").is_error()); + // ASSERT_TRUE(BigNum::from_decimal("-").is_error()); + ASSERT_TRUE(BigNum::from_decimal("123").is_ok()); + ASSERT_TRUE(BigNum::from_decimal("-123").is_ok()); + ASSERT_TRUE(BigNum::from_decimal("0").is_ok()); + ASSERT_TRUE(BigNum::from_decimal("-0").is_ok()); + ASSERT_TRUE(BigNum::from_decimal("-999999999999999999999999999999999999999999999999").is_ok()); + ASSERT_TRUE(BigNum::from_decimal("999999999999999999999999999999999999999999999999").is_ok()); +} diff --git a/tdutils/test/pq.cpp b/tdutils/test/pq.cpp index c70527e10..8260c8b59 100644 --- a/tdutils/test/pq.cpp +++ b/tdutils/test/pq.cpp @@ -70,8 +70,8 @@ static std::vector gen_pq_queries() { } static void test_pq(uint64 first, uint64 second) { - BigNum p = BigNum::from_decimal(PSLICE() << first); - BigNum q = BigNum::from_decimal(PSLICE() << second); + BigNum p = BigNum::from_decimal(PSLICE() << first).move_as_ok(); + BigNum q = BigNum::from_decimal(PSLICE() << second).move_as_ok(); BigNum pq; BigNumContext context;