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;
   }

Reply via email to