Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package fast_float for openSUSE:Factory checked in at 2026-10-11 15:14:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fast_float (Old) and /work/SRC/openSUSE:Factory/.fast_float.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fast_float" Sun Oct 11 15:14:43 2026 rev:14 rq:1383880 version:8.3.2 Changes: -------- --- /work/SRC/openSUSE:Factory/fast_float/fast_float.changes 2026-10-06 19:13:33.527305487 +0200 +++ /work/SRC/openSUSE:Factory/.fast_float.new.3698736/fast_float.changes 2026-10-11 15:14:45.199302198 +0200 @@ -1,0 +2,7 @@ +Fri Oct 9 21:31:36 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 8.3.2 + * Avoid signed negation overflow in `integer_times_pow10` + * Avoid signed overflow in `is_integer` on negative wchar_t units + +------------------------------------------------------------------- Old: ---- v8.3.1.tar.gz New: ---- v8.3.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fast_float.spec ++++++ --- /var/tmp/diff_new_pack.GvxQiW/_old 2026-10-11 15:14:46.839370749 +0200 +++ /var/tmp/diff_new_pack.GvxQiW/_new 2026-10-11 15:14:46.842370874 +0200 @@ -17,7 +17,7 @@ Name: fast_float -Version: 8.3.1 +Version: 8.3.2 Release: 0 Summary: Re-implementation of std::from_chars for parsing strings into numbers License: Apache-2.0 OR BSL-1.0 OR MIT ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.GvxQiW/_old 2026-10-11 15:14:46.953375514 +0200 +++ /var/tmp/diff_new_pack.GvxQiW/_new 2026-10-11 15:14:46.971376266 +0200 @@ -1,5 +1,5 @@ -mtime: 1791138049 -commit: abf21466f60ea271f4d014864cad018ff8717e21b8f4e645f59c8ac5f45ca1ed +mtime: 1791582352 +commit: 5847ec360eba64490bdac4c03626b0ec0a3768a5dbe797b6936c93f305ad4f60 url: https://src.opensuse.org/jengelh/fast_float revision: master ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-10-09 23:45:52.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ v8.3.1.tar.gz -> v8.3.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fast_float-8.3.1/CMakeLists.txt new/fast_float-8.3.2/CMakeLists.txt --- old/fast_float-8.3.1/CMakeLists.txt 2026-10-04 18:26:53.000000000 +0200 +++ new/fast_float-8.3.2/CMakeLists.txt 2026-10-09 21:56:38.000000000 +0200 @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.14) -project(fast_float VERSION 8.3.1 LANGUAGES CXX) +project(fast_float VERSION 8.3.2 LANGUAGES CXX) set(FASTFLOAT_CXX_STANDARD 11 CACHE STRING "the C++ standard to use for fastfloat") set(CMAKE_CXX_STANDARD ${FASTFLOAT_CXX_STANDARD}) option(FASTFLOAT_TEST "Enable tests" OFF) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fast_float-8.3.1/MODULE.bazel new/fast_float-8.3.2/MODULE.bazel --- old/fast_float-8.3.1/MODULE.bazel 2026-10-04 18:26:53.000000000 +0200 +++ new/fast_float-8.3.2/MODULE.bazel 2026-10-09 21:56:38.000000000 +0200 @@ -2,7 +2,7 @@ module( name = "fast_float", - version = "8.3.1", + version = "8.3.2", compatibility_level = 8, ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fast_float-8.3.1/README.md new/fast_float-8.3.2/README.md --- old/fast_float-8.3.1/README.md 2026-10-04 18:26:53.000000000 +0200 +++ new/fast_float-8.3.2/README.md 2026-10-09 21:56:38.000000000 +0200 @@ -587,7 +587,7 @@ FetchContent_Declare( fast_float GIT_REPOSITORY https://github.com/fastfloat/fast_float.git - GIT_TAG tags/v8.3.1 + GIT_TAG tags/v8.3.2 GIT_SHALLOW TRUE) FetchContent_MakeAvailable(fast_float) @@ -603,7 +603,7 @@ CPMAddPackage( NAME fast_float GITHUB_REPOSITORY "fastfloat/fast_float" - GIT_TAG v8.3.1) + GIT_TAG v8.3.2) ``` ## Using as single header @@ -615,7 +615,7 @@ You may directly download automatically generated single-header files: -<https://github.com/fastfloat/fast_float/releases/download/v8.3.1/fast_float.h> +<https://github.com/fastfloat/fast_float/releases/download/v8.3.2/fast_float.h> ## Benchmarking diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fast_float-8.3.1/include/fast_float/ascii_number.h new/fast_float-8.3.2/include/fast_float/ascii_number.h --- old/fast_float-8.3.1/include/fast_float/ascii_number.h 2026-10-04 18:26:53.000000000 +0200 +++ new/fast_float-8.3.2/include/fast_float/ascii_number.h 2026-10-09 21:56:38.000000000 +0200 @@ -32,7 +32,13 @@ // able to optimize it well. template <typename UC> fastfloat_really_inline constexpr bool is_integer(UC c) noexcept { - return static_cast<unsigned>(c - UC('0')) <= 9u; + // UC can be signed (wchar_t is a signed int on Linux and macOS), and the + // subtraction is then promoted to int and overflows for code units near the + // bottom of the range. Subtracting in the unsigned type wraps instead, which + // selects the same code units, as ch_to_digit already does. + using UnsignedUC = typename std::make_unsigned<UC>::type; + return static_cast<UnsignedUC>(static_cast<UnsignedUC>(c) - + static_cast<UnsignedUC>(UC('0'))) <= 9u; } fastfloat_really_inline constexpr uint64_t byteswap(uint64_t val) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fast_float-8.3.1/include/fast_float/float_common.h new/fast_float-8.3.2/include/fast_float/float_common.h --- old/fast_float-8.3.1/include/fast_float/float_common.h 2026-10-04 18:26:53.000000000 +0200 +++ new/fast_float-8.3.2/include/fast_float/float_common.h 2026-10-09 21:56:38.000000000 +0200 @@ -18,7 +18,7 @@ #define FASTFLOAT_VERSION_MAJOR 8 #define FASTFLOAT_VERSION_MINOR 3 -#define FASTFLOAT_VERSION_PATCH 1 +#define FASTFLOAT_VERSION_PATCH 2 #define FASTFLOAT_STRINGIZE_IMPL(x) #x #define FASTFLOAT_STRINGIZE(x) FASTFLOAT_STRINGIZE_IMPL(x) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fast_float-8.3.1/include/fast_float/parse_number.h new/fast_float-8.3.2/include/fast_float/parse_number.h --- old/fast_float-8.3.1/include/fast_float/parse_number.h 2026-10-04 18:26:53.000000000 +0200 +++ new/fast_float-8.3.2/include/fast_float/parse_number.h 2026-10-09 21:56:38.000000000 +0200 @@ -503,7 +503,9 @@ typename std::enable_if<is_supported_float_type<T>::value, T>::type integer_times_pow10(int64_t mantissa, int decimal_exponent) noexcept { const bool is_negative = mantissa < 0; - const uint64_t m = static_cast<uint64_t>(is_negative ? -mantissa : mantissa); + // Negate as unsigned: -mantissa overflows for the most negative int64_t. + const uint64_t m = is_negative ? uint64_t(0) - static_cast<uint64_t>(mantissa) + : static_cast<uint64_t>(mantissa); T value; if (clinger_fast_path_impl(m, decimal_exponent, is_negative, value)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fast_float-8.3.1/tests/basictest.cpp new/fast_float-8.3.2/tests/basictest.cpp --- old/fast_float-8.3.1/tests/basictest.cpp 2026-10-04 18:26:53.000000000 +0200 +++ new/fast_float-8.3.2/tests/basictest.cpp 2026-10-09 21:56:38.000000000 +0200 @@ -2485,6 +2485,10 @@ all::verify_integer_times_pow10(12345678901234567890ull, -42); all::verify_integer_times_pow10(std::numeric_limits<int64_t>::max(), 42); all::verify_integer_times_pow10(std::numeric_limits<int64_t>::max(), -42); + // the most negative int64_t has no positive counterpart to negate into + all::verify_integer_times_pow10(std::numeric_limits<int64_t>::min(), 0); + all::verify_integer_times_pow10(std::numeric_limits<int64_t>::min(), 42); + all::verify_integer_times_pow10(std::numeric_limits<int64_t>::min(), -42); all::verify_integer_times_pow10(std::numeric_limits<uint64_t>::max(), 42); all::verify_integer_times_pow10(std::numeric_limits<uint64_t>::max(), -42); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fast_float-8.3.1/tests/wide_char_test.cpp new/fast_float-8.3.2/tests/wide_char_test.cpp --- old/fast_float-8.3.1/tests/wide_char_test.cpp 2026-10-04 18:26:53.000000000 +0200 +++ new/fast_float-8.3.2/tests/wide_char_test.cpp 2026-10-09 21:56:38.000000000 +0200 @@ -70,9 +70,34 @@ return true; } +// is_integer subtracts UC('0') from the code unit. When wchar_t is signed the +// subtraction is promoted to int and overflows for code units near the bottom +// of the range, so the sanitized build aborts on input the library is supposed +// to reject. Such a unit is not a digit, so both entry points must fail. +bool test_code_unit_below_zero_digit() { + if (!std::is_signed<wchar_t>::value) { + return true; // only reproducible where wchar_t is signed + } + wchar_t const input[] = {(std::numeric_limits<wchar_t>::min)(), L'1'}; + double result; + auto answer = fast_float::from_chars(input, input + 2, result); + if (answer.ec != std::errc::invalid_argument) { + std::cerr << "a code unit below L'0' must not start a number\n"; + return false; + } + unsigned long long integer; + auto int_answer = fast_float::from_chars(input, input + 2, integer, 10); + if (int_answer.ec != std::errc::invalid_argument) { + std::cerr << "a code unit below L'0' must not start an integer\n"; + return false; + } + return true; +} + int main() { if (test_minus() && test_plus() && test_space() && test_nan() && - test_non_space_with_space_low_byte()) { + test_non_space_with_space_low_byte() && + test_code_unit_below_zero_digit()) { std::cout << "all ok" << std::endl; return EXIT_SUCCESS; }
