Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package harfbuzz for openSUSE:Factory 
checked in at 2026-01-26 10:43:06
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/harfbuzz (Old)
 and      /work/SRC/openSUSE:Factory/.harfbuzz.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "harfbuzz"

Mon Jan 26 10:43:06 2026 rev:134 rq:1328916 version:12.3.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/harfbuzz/harfbuzz.changes        2026-01-18 
22:19:08.744303059 +0100
+++ /work/SRC/openSUSE:Factory/.harfbuzz.new.1928/harfbuzz.changes      
2026-01-26 10:44:57.702350745 +0100
@@ -1,0 +2,9 @@
+Wed Jan 21 07:10:47 UTC 2026 - Bjørn Lie <[email protected]>
+
+- Update to version 12.3.1:
+  + Various speed optimizations.
+  + Build fixes for GCC 4.9.
+  + Fix NULL pointer deference when malloc fails.
+- Drop harfbuzz-CVE-2026-22693.patch: Fixed upstream.
+
+-------------------------------------------------------------------
@@ -5 +14 @@
-  (bsc#1246459 CVE-2026-22693).
+  (bsc#1256459 CVE-2026-22693).

Old:
----
  harfbuzz-12.3.0.obscpio
  harfbuzz-CVE-2026-22693.patch

New:
----
  harfbuzz-12.3.1.obscpio

----------(Old B)----------
  Old:  + Fix NULL pointer deference when malloc fails.
- Drop harfbuzz-CVE-2026-22693.patch: Fixed upstream.
----------(Old E)----------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ harfbuzz.spec ++++++
--- /var/tmp/diff_new_pack.E3EEtE/_old  2026-01-26 10:44:58.758395071 +0100
+++ /var/tmp/diff_new_pack.E3EEtE/_new  2026-01-26 10:44:58.758395071 +0100
@@ -18,15 +18,13 @@
 
 
 Name:           harfbuzz
-Version:        12.3.0
+Version:        12.3.1
 Release:        0
 Summary:        An OpenType text shaping engine
 License:        MIT
 URL:            https://www.freedesktop.org/wiki/Software/HarfBuzz
 Source0:        %{name}-%{version}.tar.zst
 Source99:       baselibs.conf
-# PATCH-FIX-UPSTREAM harfbuzz-CVE-2026-22693.patch bsc#1246459 [email protected] 
-- fix a NULL pointer dereference.
-Patch0:         harfbuzz-CVE-2026-22693.patch
 
 BuildRequires:  c++_compiler
 BuildRequires:  c_compiler

++++++ _service ++++++
--- /var/tmp/diff_new_pack.E3EEtE/_old  2026-01-26 10:44:58.798396750 +0100
+++ /var/tmp/diff_new_pack.E3EEtE/_new  2026-01-26 10:44:58.818397589 +0100
@@ -3,7 +3,7 @@
   <service name="obs_scm" mode="manual">
     <param name="scm">git</param>
     <param name="url">https://github.com/harfbuzz/harfbuzz.git</param>
-    <param name="revision">12.3.0</param>
+    <param name="revision">12.3.1</param>
     <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
     <param name="versionrewrite-pattern">v?(.*)\+0</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ harfbuzz-12.3.0.obscpio -> harfbuzz-12.3.1.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/.ci/requirements.in 
new/harfbuzz-12.3.1/.ci/requirements.in
--- old/harfbuzz-12.3.0/.ci/requirements.in     2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/.ci/requirements.in     2026-01-20 22:59:40.000000000 
+0100
@@ -1,4 +1,4 @@
 -r requirements-fonttools.in
-meson==1.10.0
+meson==1.10.1
 ninja
 setuptools # https://github.com/harfbuzz/harfbuzz/issues/4475
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/.ci/requirements.txt 
new/harfbuzz-12.3.1/.ci/requirements.txt
--- old/harfbuzz-12.3.0/.ci/requirements.txt    2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/.ci/requirements.txt    2026-01-20 22:59:40.000000000 
+0100
@@ -106,9 +106,9 @@
     
--hash=sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd \
     
--hash=sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd
     # via -r requirements-fonttools.in
-meson==1.10.0 \
-    
--hash=sha256:4b27aafce281e652dcb437b28007457411245d975c48b5db3a797d3e93ae1585 \
-    
--hash=sha256:8071860c1f46a75ea34801490fd1c445c9d75147a65508cd3a10366a7006cc1c
+meson==1.10.1 \
+    
--hash=sha256:c42296f12db316a4515b9375a5df330f2e751ccdd4f608430d41d7d6210e4317 \
+    
--hash=sha256:fe43d1cc2e6de146fbea78f3a062194bcc0e779efc8a0f0d7c35544dfb86731f
     # via -r requirements.in
 ninja==1.13.0 \
     
--hash=sha256:11be2d22027bde06f14c343f01d31446747dbb51e72d00decca2eb99be911e2f \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/.github/workflows/scorecard.yml 
new/harfbuzz-12.3.1/.github/workflows/scorecard.yml
--- old/harfbuzz-12.3.0/.github/workflows/scorecard.yml 2025-12-27 
21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/.github/workflows/scorecard.yml 2026-01-20 
22:59:40.000000000 +0100
@@ -59,6 +59,6 @@
 
       # Upload the results to GitHub's code scanning dashboard.
       - name: "Upload to code-scanning"
-        uses: 
github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # 
v3.29.5
+        uses: 
github/codeql-action/upload-sarif@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # 
v3.29.5
         with:
           sarif_file: results.sarif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/NEWS new/harfbuzz-12.3.1/NEWS
--- old/harfbuzz-12.3.0/NEWS    2025-12-27 21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/NEWS    2026-01-20 22:59:40.000000000 +0100
@@ -1,3 +1,11 @@
+Overview of changes leading to 12.3.1
+Tuesday, January 20, 2026
+=====================================
+- Various speed optimizations.
+- Build fixes for GCC 4.9.
+- Fix NULL pointer deference when malloc fails.
+
+
 Overview of changes leading to 12.3.0
 Saturday, December 27, 2025
 =====================================
@@ -13,7 +21,7 @@
   * Drawing mega variable-fonts: 30% speedup on GoogleSansFlex benchmark.
   * Drawing `VARC` fonts: 5% speedup on varc-hanzi benchmark.
 - Always apply synthetic slant around horizontal glyph origin in hb-draw API.
-- Fix undefined C++ behavior in some uses union.
+- Fix undefined C++ behavior in some uses of union.
 - Remove the disabled by default uniscribe-bug-compatible mode from Indic and
   Khmer shapers, that used to be used when testing against Uniscribe shaping
   behaviour.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/README.md 
new/harfbuzz-12.3.1/README.md
--- old/harfbuzz-12.3.0/README.md       2025-12-27 21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/README.md       2026-01-20 22:59:40.000000000 +0100
@@ -33,7 +33,7 @@
 
 The API and ABI are stable even across major version number jumps. In fact,
 current HarfBuzz is API/ABI compatible all the way back to the 0.9.x series.
-If one day we need to break the API/ABI, that would be called a new a library.
+If one day we need to break the API/ABI, that would be called a new library.
 
 As such, we bump the major version number only when we add major new features,
 the minor version when there is new API, and the micro version when there
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/meson.build 
new/harfbuzz-12.3.1/meson.build
--- old/harfbuzz-12.3.0/meson.build     2025-12-27 21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/meson.build     2026-01-20 22:59:40.000000000 +0100
@@ -1,12 +1,13 @@
 project('harfbuzz', ['c', 'cpp'],
   meson_version: '>= 0.60.0',
-  version: '12.3.0',
+  version: '12.3.1',
   default_options: [
     'cpp_eh=none',          # Just to support msvc, we are passing 
-fno-exceptions also anyway
     # 'cpp_rtti=false',     # Do NOT enable, wraps inherit it and ICU needs 
RTTI
     'cpp_std=c++11',
     'wrap_mode=nofallback', # Use --wrap-mode=default to revert, 
https://github.com/harfbuzz/harfbuzz/pull/2548
     'buildtype=debugoptimized',
+    'b_ndebug=if-release',  # Disable asserts in release builds
   ],
 )
 
@@ -30,7 +31,6 @@
 cpp = meson.get_compiler('cpp')
 null_dep = dependency('', required: false)
 
-
 # Includes Microsoft Clang compiler with GNU arguments, see
 # https://github.com/harfbuzz/harfbuzz/pull/4394
 cpp_is_microsoft_compiler = host_machine.system() == 'windows' and 
cpp.get_define('_MSC_FULL_VER') != ''
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/perf/benchmark-shape.cc 
new/harfbuzz-12.3.1/perf/benchmark-shape.cc
--- old/harfbuzz-12.3.0/perf/benchmark-shape.cc 2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/perf/benchmark-shape.cc 2026-01-20 22:59:40.000000000 
+0100
@@ -10,6 +10,20 @@
   const char *text_path;
 } default_tests[] =
 {
+  {"perf/fonts/Roboto-Regular.ttf",
+   "perf/texts/en-thelittleprince.txt"},
+
+  {"perf/fonts/Roboto-Regular.ttf",
+   "perf/texts/en-words.txt"},
+
+  {SUBSET_FONT_BASE_PATH "SourceSerifVariable-Roman.ttf",
+   "perf/texts/react-dom.txt"},
+
+  {SUBSET_FONT_BASE_PATH "NotoSansDevanagari-Regular.ttf",
+   "perf/texts/hi-words.txt"},
+
+  {"perf/fonts/Amiri-Regular.ttf",
+   "perf/texts/fa-thelittleprince.txt"},
 
   {"perf/fonts/NotoNastaliqUrdu-Regular.ttf",
    "perf/texts/fa-thelittleprince.txt"},
@@ -17,20 +31,14 @@
   {"perf/fonts/NotoNastaliqUrdu-Regular.ttf",
    "perf/texts/fa-words.txt"},
 
-  {"perf/fonts/Amiri-Regular.ttf",
+  {"perf/fonts/Gulzar-Regular.ttf",
    "perf/texts/fa-thelittleprince.txt"},
 
-  {SUBSET_FONT_BASE_PATH "NotoSansDevanagari-Regular.ttf",
-   "perf/texts/hi-words.txt"},
-
-  {"perf/fonts/Roboto-Regular.ttf",
-   "perf/texts/en-thelittleprince.txt"},
-
-  {"perf/fonts/Roboto-Regular.ttf",
-   "perf/texts/en-words.txt"},
+  {"perf/fonts/Gulzar-Regular.ttf",
+   "perf/texts/fa-words.txt"},
 
-  {SUBSET_FONT_BASE_PATH "SourceSerifVariable-Roman.ttf",
-   "perf/texts/react-dom.txt"},
+  {"perf/fonts/NotoSansDuployan-Regular.otf",
+   "perf/texts/duployan.txt"},
 };
 
 static test_input_t *tests = default_tests;
@@ -100,7 +108,8 @@
   for (auto _ : state)
   {
     bool ret = shape (buf, font, text, text_length, shaper);
-    assert (ret);
+    if (!ret)
+      abort ();
   }
 
 done:
Binary files old/harfbuzz-12.3.0/perf/fonts/Gulzar-Regular.ttf and 
new/harfbuzz-12.3.1/perf/fonts/Gulzar-Regular.ttf differ
Binary files old/harfbuzz-12.3.0/perf/fonts/NotoSansDuployan-Regular.otf and 
new/harfbuzz-12.3.1/perf/fonts/NotoSansDuployan-Regular.otf differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/OT/Layout/GDEF/GDEF.hh 
new/harfbuzz-12.3.1/src/OT/Layout/GDEF/GDEF.hh
--- old/harfbuzz-12.3.0/src/OT/Layout/GDEF/GDEF.hh      2025-12-27 
21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/src/OT/Layout/GDEF/GDEF.hh      2026-01-20 
22:59:40.000000000 +0100
@@ -1002,20 +1002,34 @@
 
     }
 
+    HB_ALWAYS_INLINE
     bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) 
const
     {
       return
 #ifndef HB_NO_GDEF_CACHE
-            mark_glyph_sets[set_index].may_have (glyph_id)
-#else
-            table->mark_set_covers (set_index, glyph_id)
+            // We can access arrayZ directly because of 
sanitize_lookup_props() guarantee.
+            mark_glyph_sets.arrayZ[set_index].may_have (glyph_id) &&
 #endif
+            table->mark_set_covers (set_index, glyph_id)
       ;
     }
 
+    unsigned sanitize_lookup_props (unsigned lookup_props) const
+    {
+#ifndef HB_NO_GDEF_CACHE
+      if (lookup_props & LookupFlag::UseMarkFilteringSet &&
+         (lookup_props >> 16) >= mark_glyph_sets.length)
+      {
+        // Invalid mark filtering set index; unset the flag.
+       lookup_props &= ~LookupFlag::UseMarkFilteringSet;
+      }
+#endif
+      return lookup_props;
+    }
+
     hb_blob_ptr_t<GDEF> table;
 #ifndef HB_NO_GDEF_CACHE
-    hb_vector_t<hb_bit_set_t> mark_glyph_sets;
+    hb_vector_t<hb_set_digest_t> mark_glyph_sets;
     mutable hb_cache_t<21, 3> glyph_props_cache;
     static_assert (sizeof (glyph_props_cache) == 512, "");
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/OT/Layout/types.hh 
new/harfbuzz-12.3.1/src/OT/Layout/types.hh
--- old/harfbuzz-12.3.0/src/OT/Layout/types.hh  2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/src/OT/Layout/types.hh  2026-01-20 22:59:40.000000000 
+0100
@@ -29,11 +29,11 @@
 #ifndef OT_LAYOUT_TYPES_HH
 #define OT_LAYOUT_TYPES_HH
 
-using hb_ot_layout_mapping_cache_t = hb_cache_t<15, 8, 7>;
-static_assert (sizeof (hb_ot_layout_mapping_cache_t) == 256, "");
+using hb_ot_layout_mapping_cache_t = hb_cache_t<16, 8, 8>;
+static_assert (sizeof (hb_ot_layout_mapping_cache_t) == 512, "");
 
-using hb_ot_layout_binary_cache_t = hb_cache_t<14, 1, 7>;
-static_assert (sizeof (hb_ot_layout_binary_cache_t) == 128, "");
+using hb_ot_layout_binary_cache_t = hb_cache_t<14, 1, 8>;
+static_assert (sizeof (hb_ot_layout_binary_cache_t) == 256, "");
 
 namespace OT {
 namespace Layout {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/hb-kbts.cc 
new/harfbuzz-12.3.1/src/hb-kbts.cc
--- old/harfbuzz-12.3.0/src/hb-kbts.cc  2025-12-27 21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/src/hb-kbts.cc  2026-01-20 22:59:40.000000000 +0100
@@ -39,10 +39,125 @@
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wcast-align"
 #pragma GCC diagnostic ignored "-Wunused-function"
-#pragma GCC diagnostic ignored "-Wsign-compare"
+#pragma GCC diagnostic ignored "-Wextra-semi-stmt"
 #include "kb_text_shape.h"
 #pragma GCC diagnostic pop
 
+static hb_user_data_key_t hb_kbts_shape_plan_data_key = {0};
+
+struct hb_kbts_shape_plan_data_t
+{
+  kbts_shape_config *config = nullptr;
+  mutable hb_atomic_t<kbts_shape_scratchpad *> scratchpad;
+};
+
+static void
+hb_kbts_shape_plan_data_destroy (void *data)
+{
+  auto *plan_data = (hb_kbts_shape_plan_data_t *) data;
+  if (!plan_data)
+    return;
+
+  auto *scratchpad = plan_data->scratchpad.get_acquire ();
+  if (scratchpad && plan_data->scratchpad.cmpexch (scratchpad, nullptr))
+    kbts_DestroyShapeScratchpad (scratchpad);
+
+  if (plan_data->config)
+    kbts_DestroyShapeConfig (plan_data->config);
+
+  hb_free (plan_data);
+}
+
+static void
+hb_kbts_plan_props_to_script_language (const hb_segment_properties_t &props,
+                                      kbts_script *kb_script,
+                                      kbts_language *kb_language)
+{
+  hb_tag_t scripts[HB_OT_MAX_TAGS_PER_SCRIPT];
+  hb_tag_t language;
+  unsigned int script_count = ARRAY_LENGTH (scripts);
+  unsigned int language_count = 1;
+
+  *kb_script = KBTS_SCRIPT_DONT_KNOW;
+  *kb_language = KBTS_LANGUAGE_DEFAULT;
+
+  hb_ot_tags_from_script_and_language (props.script, props.language,
+                                      &script_count, scripts,
+                                      &language_count, &language);
+
+  for (unsigned int i = 0; i < script_count && scripts[i] != HB_TAG_NONE; ++i)
+  {
+    *kb_script = kbts_ScriptTagToScript (hb_uint32_swap (scripts[i]));
+    if (*kb_script != KBTS_SCRIPT_DONT_KNOW)
+      break;
+  }
+
+  if (language_count)
+    *kb_language = (kbts_language) hb_uint32_swap (language);
+}
+
+static hb_kbts_shape_plan_data_t *
+hb_kbts_get_shape_plan_data (hb_shape_plan_t *shape_plan,
+                            kbts_font *kb_font)
+{
+retry:
+  auto *plan_data = (hb_kbts_shape_plan_data_t *)
+    hb_shape_plan_get_user_data (shape_plan, &hb_kbts_shape_plan_data_key);
+  if (plan_data)
+    return plan_data;
+
+  kbts_script kb_script;
+  kbts_language kb_language;
+  hb_kbts_plan_props_to_script_language (shape_plan->key.props, &kb_script, 
&kb_language);
+
+  kbts_shape_config *config = kbts_CreateShapeConfig (kb_font, kb_script, 
kb_language, nullptr, nullptr);
+  if (unlikely (!config))
+    return nullptr;
+
+  plan_data = (hb_kbts_shape_plan_data_t *) hb_calloc (1, sizeof (*plan_data));
+  if (unlikely (!plan_data))
+  {
+    kbts_DestroyShapeConfig (config);
+    return nullptr;
+  }
+
+  plan_data->config = config;
+  plan_data->scratchpad.init (nullptr);
+
+  if (!hb_shape_plan_set_user_data (shape_plan,
+                                   &hb_kbts_shape_plan_data_key,
+                                   plan_data,
+                                   hb_kbts_shape_plan_data_destroy,
+                                   false))
+  {
+    hb_kbts_shape_plan_data_destroy (plan_data);
+    goto retry;
+  }
+
+  return plan_data;
+}
+
+static kbts_shape_scratchpad *
+hb_kbts_acquire_shape_scratchpad (hb_kbts_shape_plan_data_t *plan_data)
+{
+  auto *scratchpad = plan_data->scratchpad.get_acquire ();
+  if (!scratchpad || unlikely (!plan_data->scratchpad.cmpexch (scratchpad, 
nullptr)))
+    scratchpad = kbts_CreateShapeScratchpad (plan_data->config, nullptr, 
nullptr);
+
+  return scratchpad;
+}
+
+static void
+hb_kbts_release_shape_scratchpad (hb_kbts_shape_plan_data_t *plan_data,
+                                 kbts_shape_scratchpad *scratchpad)
+{
+  if (!scratchpad)
+    return;
+
+  if (!plan_data->scratchpad.cmpexch (nullptr, scratchpad))
+    kbts_DestroyShapeScratchpad (scratchpad);
+}
+
 
 hb_kbts_face_data_t *
 _hb_kbts_shaper_face_data_create (hb_face_t *face)
@@ -131,28 +246,26 @@
   if (unlikely (!kbts_InitializeGlyphStorage (&kb_glyph_storage, nullptr, 
nullptr)))
     return false;
 
-  kbts_script kb_script = KBTS_SCRIPT_DONT_KNOW;
-  kbts_language kb_language = KBTS_LANGUAGE_DEFAULT;
+  hb_kbts_shape_plan_data_t *plan_data = hb_kbts_get_shape_plan_data 
(shape_plan, kb_font);
+  if (unlikely (!plan_data))
   {
-    hb_tag_t scripts[HB_OT_MAX_TAGS_PER_SCRIPT];
-    hb_tag_t language;
-    unsigned int script_count = ARRAY_LENGTH (scripts);
-    unsigned int language_count = 1;
-
-    hb_ot_tags_from_script_and_language (buffer->props.script, 
buffer->props.language,
-                                        &script_count, scripts,
-                                        &language_count, &language);
+    kbts_FreeAllGlyphs (&kb_glyph_storage);
+    return false;
+  }
 
-    for (unsigned int i = 0; i < script_count && scripts[i] != HB_TAG_NONE; 
++i)
-    {
-      kb_script = kbts_ScriptTagToScript (hb_uint32_swap (scripts[i]));
-      if (kb_script != KBTS_SCRIPT_DONT_KNOW)
-        break;
-    }
+  kbts_shape_config *kb_shape_config = nullptr;
+  kbts_shape_scratchpad *kb_shape_scratchpad = nullptr;
+  uint32_t glyph_count = 0;
+  kbts_glyph *kb_glyph = nullptr;
+  kbts_glyph_iterator kb_output;
+  hb_glyph_info_t *info;
+  hb_glyph_position_t *pos;
+  hb_bool_t res = false;
 
-    if (language_count)
-      kb_language = (kbts_language) hb_uint32_swap (language);
-  }
+  kb_shape_config = plan_data->config;
+  kb_shape_scratchpad = hb_kbts_acquire_shape_scratchpad (plan_data);
+  if (unlikely (!kb_shape_scratchpad))
+    goto done;
 
   for (size_t i = 0; i < buffer->len; ++i)
   {
@@ -166,25 +279,17 @@
          kb_features.push<kbts_feature_override>({ hb_uint32_swap 
(features[j].tag), (int)features[j].value });
       }
       if (kb_features)
-        kb_config = kbts_CreateGlyphConfig (kb_features.arrayZ, 
kb_features.length, nullptr, nullptr);
+        kb_config = kbts_CreateGlyphConfig (kb_shape_config, 
kb_features.arrayZ, kb_features.length, nullptr, nullptr);
     }
     kbts_PushGlyph (&kb_glyph_storage, kb_font, buffer->info[i].codepoint, 
kb_config, buffer->info[i].cluster);
   }
 
-  uint32_t glyph_count = 0;
-  kbts_glyph *kb_glyph = nullptr;
-  kbts_glyph_iterator kb_output;
-  hb_glyph_info_t *info;
-  hb_glyph_position_t *pos;
-
-  kbts_shape_config *kb_shape_config = kbts_CreateShapeConfig (kb_font, 
kb_script, kb_language, nullptr, nullptr);
-  hb_bool_t res = kbts_ShapeDirect (kb_shape_config, &kb_glyph_storage, 
kb_direction,
-                                   nullptr, nullptr, &kb_output) == 
KBTS_SHAPE_ERROR_NONE;
+  res = kbts_ShapeDirect (kb_shape_scratchpad, &kb_glyph_storage, 
kb_direction, &kb_output) == KBTS_SHAPE_ERROR_NONE;
   if (unlikely (!res))
-      goto done;
+    goto done;
 
   for (auto it = kb_output; kbts_GlyphIteratorNext (&it, &kb_glyph); )
-   glyph_count += 1;
+    glyph_count += 1;
 
   hb_buffer_set_content_type (buffer, HB_BUFFER_CONTENT_TYPE_GLYPHS);
   hb_buffer_set_length (buffer, glyph_count);
@@ -205,7 +310,8 @@
   }
 
 done:
-  kbts_DestroyShapeConfig (kb_shape_config);
+  if (likely (kb_shape_scratchpad))
+    hb_kbts_release_shape_scratchpad (plan_data, kb_shape_scratchpad);
   while (kbts_GlyphIteratorNext (&kb_output, &kb_glyph))
     kbts_DestroyGlyphConfig (kb_glyph->Config);
   kbts_FreeAllGlyphs (&kb_glyph_storage);
@@ -216,4 +322,4 @@
   return res;
 }
 
-#endif
\ No newline at end of file
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/hb-map.hh 
new/harfbuzz-12.3.1/src/hb-map.hh
--- old/harfbuzz-12.3.0/src/hb-map.hh   2025-12-27 21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/src/hb-map.hh   2026-01-20 22:59:40.000000000 +0100
@@ -492,16 +492,16 @@
   hb_hashmap_t& operator << (const hb_pair_t<K, V>& v)
   { set (v.first, v.second); return *this; }
   template <typename V2 = V,
-           hb_enable_if (!std::is_trivially_copyable<V2>::value)>
+           hb_enable_if (!hb_is_trivially_copyable (V2))>
   hb_hashmap_t& operator << (const hb_pair_t<K, V&&>& v)
   { set (v.first, std::move (v.second)); return *this; }
   template <typename K2 = K,
-           hb_enable_if (!std::is_trivially_copyable<K2>::value)>
+           hb_enable_if (!hb_is_trivially_copyable (K2))>
   hb_hashmap_t& operator << (const hb_pair_t<K&&, V>& v)
   { set (std::move (v.first), v.second); return *this; }
   template <typename K2 = K, typename V2 = V,
-           hb_enable_if (!std::is_trivially_copyable<K2>::value &&
-                         !std::is_trivially_copyable<V2>::value)>
+           hb_enable_if (!hb_is_trivially_copyable (K2) &&
+                         !hb_is_trivially_copyable (V2))>
   hb_hashmap_t& operator << (const hb_pair_t<K&&, V&&>& v)
   { set (std::move (v.first), std::move (v.second)); return *this; }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/hb-ot-cmap-table.hh 
new/harfbuzz-12.3.1/src/hb-ot-cmap-table.hh
--- old/harfbuzz-12.3.0/src/hb-ot-cmap-table.hh 2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/src/hb-ot-cmap-table.hh 2026-01-20 22:59:40.000000000 
+0100
@@ -1670,6 +1670,10 @@
   {
     SubtableUnicodesCache* cache =
         (SubtableUnicodesCache*) hb_malloc (sizeof(SubtableUnicodesCache));
+
+    if (unlikely (!cache))
+      return nullptr;
+
     new (cache) SubtableUnicodesCache (source_table);
     return cache;
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/hb-ot-layout-gsubgpos.hh 
new/harfbuzz-12.3.1/src/hb-ot-layout-gsubgpos.hh
--- old/harfbuzz-12.3.0/src/hb-ot-layout-gsubgpos.hh    2025-12-27 
21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/src/hb-ot-layout-gsubgpos.hh    2026-01-20 
22:59:40.000000000 +0100
@@ -582,11 +582,12 @@
 #endif
   bool next (unsigned *unsafe_to = nullptr)
   {
+    auto *info = c->buffer->info;
     const signed stop = (signed) end - 1;
     while ((signed) idx < stop)
     {
       idx++;
-      switch (match (c->buffer->info[idx]))
+      switch (match (info[idx]))
       {
        case MATCH:
        {
@@ -612,11 +613,12 @@
 #endif
   bool prev (unsigned *unsafe_from = nullptr)
   {
+    auto *out_info = c->buffer->out_info;
     const unsigned stop = 0;
     while (idx > stop)
     {
       idx--;
-      switch (match (c->buffer->out_info[idx]))
+      switch (match (out_info[idx]))
       {
        case MATCH:
        {
@@ -786,7 +788,11 @@
   void set_random (bool random_) { random = random_; }
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
   void set_lookup_index (unsigned int lookup_index_) { lookup_index = 
lookup_index_; }
-  void set_lookup_props (unsigned int lookup_props_) { lookup_props = 
lookup_props_; init_iters (); }
+  void set_lookup_props (unsigned int lookup_props_)
+  {
+    lookup_props = gdef_accel.sanitize_lookup_props (lookup_props_);
+    init_iters ();
+  }
 
   uint32_t random_number ()
   {
@@ -831,7 +837,7 @@
     if (glyph_props & match_props & LookupFlag::IgnoreFlags)
       return false;
 
-    if (unlikely (glyph_props & HB_OT_LAYOUT_GLYPH_PROPS_MARK))
+    if (glyph_props & HB_OT_LAYOUT_GLYPH_PROPS_MARK)
       return match_properties_mark (info, glyph_props, match_props);
 
     return true;
@@ -1994,13 +2000,12 @@
 }
 
 template <typename HBUINT>
-HB_ALWAYS_INLINE
-static bool context_apply_lookup (hb_ot_apply_context_t *c,
-                                 unsigned int inputCount, /* Including the 
first glyph (not matched) */
-                                 const HBUINT input[], /* Array of input 
values--start with second glyph */
-                                 unsigned int lookupCount,
-                                 const LookupRecord lookupRecord[],
-                                 const ContextApplyLookupContext 
&lookup_context)
+static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
+                                        unsigned int inputCount, /* Including 
the first glyph (not matched) */
+                                        const HBUINT input[], /* Array of 
input values--start with second glyph */
+                                        unsigned int lookupCount,
+                                        const LookupRecord lookupRecord[],
+                                        const ContextApplyLookupContext 
&lookup_context)
 {
   if (unlikely (inputCount > HB_MAX_CONTEXT_LENGTH)) return false;
 
@@ -2276,7 +2281,7 @@
     skippy_iter.reset (c->buffer->idx);
     skippy_iter.set_match_func (match_always, nullptr);
     skippy_iter.set_glyph_data ((HBUINT16 *) nullptr);
-    unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0;
+    unsigned unsafe_to = (unsigned) -1, unsafe_to1, unsafe_to2 = 0;
     hb_glyph_info_t *first = nullptr, *second = nullptr;
     bool matched = skippy_iter.next ();
     if (likely (matched))
@@ -2289,7 +2294,7 @@
       }
 
       first = &c->buffer->info[skippy_iter.idx];
-      unsafe_to = skippy_iter.idx + 1;
+      unsafe_to1 = skippy_iter.idx + 1;
     }
     else
     {
@@ -3136,17 +3141,16 @@
 }
 
 template <typename HBUINT>
-HB_ALWAYS_INLINE
-static bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
-                                       unsigned int backtrackCount,
-                                       const HBUINT backtrack[],
-                                       unsigned int inputCount, /* Including 
the first glyph (not matched) */
-                                       const HBUINT input[], /* Array of input 
values--start with second glyph */
-                                       unsigned int lookaheadCount,
-                                       const HBUINT lookahead[],
-                                       unsigned int lookupCount,
-                                       const LookupRecord lookupRecord[],
-                                       const ChainContextApplyLookupContext 
&lookup_context)
+static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
+                                              unsigned int backtrackCount,
+                                              const HBUINT backtrack[],
+                                              unsigned int inputCount, /* 
Including the first glyph (not matched) */
+                                              const HBUINT input[], /* Array 
of input values--start with second glyph */
+                                              unsigned int lookaheadCount,
+                                              const HBUINT lookahead[],
+                                              unsigned int lookupCount,
+                                              const LookupRecord 
lookupRecord[],
+                                              const 
ChainContextApplyLookupContext &lookup_context)
 {
   if (unlikely (inputCount > HB_MAX_CONTEXT_LENGTH)) return false;
 
@@ -3473,7 +3477,7 @@
     skippy_iter.reset (c->buffer->idx);
     skippy_iter.set_match_func (match_always, nullptr);
     skippy_iter.set_glyph_data ((HBUINT16 *) nullptr);
-    unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0;
+    unsigned unsafe_to = (unsigned) -1, unsafe_to1, unsafe_to2 = 0;
     hb_glyph_info_t *first = nullptr, *second = nullptr;
     bool matched = skippy_iter.next ();
     if (likely (matched))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/hb-ot-var-avar-table.hh 
new/harfbuzz-12.3.1/src/hb-ot-var-avar-table.hh
--- old/harfbuzz-12.3.0/src/hb-ot-var-avar-table.hh     2025-12-27 
21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/src/hb-ot-var-avar-table.hh     2026-01-20 
22:59:40.000000000 +0100
@@ -456,6 +456,8 @@
 
     OT::ItemVariationStore::destroy_cache (var_store_cache);
     return true;
+#else
+    return version.major < 2;
 #endif
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/hb-ot-var-common.hh 
new/harfbuzz-12.3.1/src/hb-ot-var-common.hh
--- old/harfbuzz-12.3.0/src/hb-ot-var-common.hh 2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/src/hb-ot-var-common.hh 2026-01-20 22:59:40.000000000 
+0100
@@ -320,13 +320,13 @@
   void copy_from (const tuple_delta_t& o, hb_alloc_pool_t *pool = nullptr)
   {
     axis_tuples = o.axis_tuples;
-    indices.allocate_from_pool (pool, o.indices);
-    deltas_x.allocate_from_pool (pool, o.deltas_x);
-    deltas_y.allocate_from_pool (pool, o.deltas_y);
-    compiled_tuple_header.allocate_from_pool (pool, o.compiled_tuple_header);
-    compiled_deltas.allocate_from_pool (pool, o.compiled_deltas);
-    compiled_peak_coords.allocate_from_pool (pool, o.compiled_peak_coords);
-    compiled_interm_coords.allocate_from_pool (pool, o.compiled_interm_coords);
+    indices.duplicate_vector_from_pool (pool, o.indices);
+    deltas_x.duplicate_vector_from_pool (pool, o.deltas_x);
+    deltas_y.duplicate_vector_from_pool (pool, o.deltas_y);
+    compiled_tuple_header.duplicate_vector_from_pool (pool, 
o.compiled_tuple_header);
+    compiled_deltas.duplicate_vector_from_pool (pool, o.compiled_deltas);
+    compiled_peak_coords.duplicate_vector_from_pool (pool, 
o.compiled_peak_coords);
+    compiled_interm_coords.duplicate_vector_from_pool (pool, 
o.compiled_interm_coords);
   }
 
   void remove_axis (hb_tag_t axis_tag)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/hb-vector.hh 
new/harfbuzz-12.3.1/src/hb-vector.hh
--- old/harfbuzz-12.3.0/src/hb-vector.hh        2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/src/hb-vector.hh        2026-01-20 22:59:40.000000000 
+0100
@@ -570,7 +570,7 @@
 
   template <typename allocator_t>
   HB_ALWAYS_INLINE_VECTOR_ALLOCS
-  bool allocate_from_pool (allocator_t *allocator, const hb_vector_t &other)
+  bool duplicate_vector_from_pool (allocator_t *allocator, const hb_vector_t 
&other)
   {
     if (unlikely (!allocate_from_pool (allocator, other.length, false)))
       return false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/hb-version.h 
new/harfbuzz-12.3.1/src/hb-version.h
--- old/harfbuzz-12.3.0/src/hb-version.h        2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/src/hb-version.h        2026-01-20 22:59:40.000000000 
+0100
@@ -53,14 +53,14 @@
  *
  * The micro component of the library version available at compile-time.
  */
-#define HB_VERSION_MICRO 0
+#define HB_VERSION_MICRO 1
 
 /**
  * HB_VERSION_STRING:
  *
  * A string literal containing the library version available at compile-time.
  */
-#define HB_VERSION_STRING "12.3.0"
+#define HB_VERSION_STRING "12.3.1"
 
 /**
  * HB_VERSION_ATLEAST:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/src/rust/Cargo.toml 
new/harfbuzz-12.3.1/src/rust/Cargo.toml
--- old/harfbuzz-12.3.0/src/rust/Cargo.toml     2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/src/rust/Cargo.toml     2026-01-20 22:59:40.000000000 
+0100
@@ -5,7 +5,7 @@
 
 [dependencies]
 skrifa = { version = "0.*", optional = true }
-harfrust = { version = "0.4.*", optional = true }
+harfrust = { version = "0.5.*", optional = true }
 # harfrust = { git = "https://github.com/harfbuzz/harfrust";, optional = true }
 
 [lib]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/subprojects/kbts.wrap 
new/harfbuzz-12.3.1/subprojects/kbts.wrap
--- old/harfbuzz-12.3.0/subprojects/kbts.wrap   2025-12-27 21:33:25.000000000 
+0100
+++ new/harfbuzz-12.3.1/subprojects/kbts.wrap   2026-01-20 22:59:40.000000000 
+0100
@@ -1,5 +1,5 @@
 [wrap-git]
 url = https://github.com/JimmyLefevre/kb.git
-revision = 67a6b1e82e59df831d9d75ca289955beecfc2549
+revision = ca6c9624dd7c6b774e6cec9901f3d8d998d6f62a
 depth = 1
 patch_directory = kbts
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/test/api/test-cplusplus.cc 
new/harfbuzz-12.3.1/test/api/test-cplusplus.cc
--- old/harfbuzz-12.3.0/test/api/test-cplusplus.cc      2025-12-27 
21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/test/api/test-cplusplus.cc      2026-01-20 
22:59:40.000000000 +0100
@@ -41,7 +41,6 @@
 
 #include "hb-cplusplus.hh"
 
-#include <cassert>
 #include <functional>
 #include <utility>
 
@@ -52,28 +51,28 @@
   hb::shared_ptr<hb_buffer_t> pb {b};
 
   /* Test copy-construction. */
-  assert (bool (pb));
+  g_assert_true (bool (pb));
   hb::shared_ptr<hb_buffer_t> pb2 {pb};
-  assert (bool (pb2));
-  assert (bool (pb));
+  g_assert_true (bool (pb2));
+  g_assert_true (bool (pb));
 
   /* Test move-construction. */
-  assert (bool (pb2));
+  g_assert_true (bool (pb2));
   hb::shared_ptr<hb_buffer_t> pb4 {std::move (pb2)};
-  assert (!bool (pb2));
-  assert (bool (pb4));
+  g_assert_true (!bool (pb2));
+  g_assert_true (bool (pb4));
 
   /* Test copy-assignment. */
   hb::shared_ptr<hb_buffer_t> pb3;
-  assert (!bool (pb3));
+  g_assert_true (!bool (pb3));
   pb3 = pb;
-  assert (bool (pb3));
-  assert (bool (pb));
+  g_assert_true (bool (pb3));
+  g_assert_true (bool (pb));
 
   /* Test move-assignment. */
-  assert (bool (pb));
+  g_assert_true (bool (pb));
   pb2 = std::move (pb);
-  assert (!bool (pb));
+  g_assert_true (!bool (pb));
 
   pb.reference ();
   pb.destroy ();
@@ -96,9 +95,9 @@
   std::hash<hb::shared_ptr<hb_buffer_t>> hash2 {};
   std::hash<hb::unique_ptr<hb_buffer_t>> hash3 {};
 
-  assert (hash (b) == hash2 (pb4));
-  assert (hash2 (pb4) == hash2 (pb2));
-  assert (hash (b) == hash3 (pb5));
+  g_assert_true (hash (b) == hash2 (pb4));
+  g_assert_true (hash2 (pb4) == hash2 (pb2));
+  g_assert_true (hash (b) == hash3 (pb5));
 
   g_assert_true (pb != pb.get_empty ());
   g_assert_true (pb != pb2);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/test/api/test-get-table-tags.c 
new/harfbuzz-12.3.1/test/api/test-get-table-tags.c
--- old/harfbuzz-12.3.0/test/api/test-get-table-tags.c  2025-12-27 
21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/test/api/test-get-table-tags.c  2026-01-20 
22:59:40.000000000 +0100
@@ -142,10 +142,10 @@
                                                             hb_blob_get_data 
(blob, NULL),
                                                             hb_blob_get_length 
(blob),
                                                             NULL);
-  assert (provider);
+  g_assert_true (provider);
 
   CGFontRef cg_font = CGFontCreateWithDataProvider (provider);
-  assert (cg_font);
+  g_assert_true (cg_font);
   CGDataProviderRelease (provider);
 
   hb_face_t *face = hb_coretext_face_create (cg_font);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/test/fuzzing/hb-subset-fuzzer.cc 
new/harfbuzz-12.3.1/test/fuzzing/hb-subset-fuzzer.cc
--- old/harfbuzz-12.3.0/test/fuzzing/hb-subset-fuzzer.cc        2025-12-27 
21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/test/fuzzing/hb-subset-fuzzer.cc        2026-01-20 
22:59:40.000000000 +0100
@@ -34,7 +34,8 @@
     unsigned int bytes_count = 0;
     for (unsigned int i = 0; i < length; ++i)
       if (data[i]) ++bytes_count;
-    assert (bytes_count || !length);
+    if (!(bytes_count || !length))
+      abort ();
 
     hb_blob_destroy (blob);
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/harfbuzz-12.3.0/test/threads/hb-shape-threads.cc 
new/harfbuzz-12.3.1/test/threads/hb-shape-threads.cc
--- old/harfbuzz-12.3.0/test/threads/hb-shape-threads.cc        2025-12-27 
21:33:25.000000000 +0100
+++ new/harfbuzz-12.3.1/test/threads/hb-shape-threads.cc        2026-01-20 
22:59:40.000000000 +0100
@@ -126,7 +126,8 @@
   }
 
   bool ret = hb_font_set_funcs_using (font, backend);
-  assert (ret);
+  if (!ret)
+    abort ();
 
   std::vector<std::thread> threads;
   for (unsigned i = 0; i < num_threads; i++)

++++++ harfbuzz.obsinfo ++++++
--- /var/tmp/diff_new_pack.E3EEtE/_old  2026-01-26 10:45:04.362630301 +0100
+++ /var/tmp/diff_new_pack.E3EEtE/_new  2026-01-26 10:45:04.374630805 +0100
@@ -1,5 +1,5 @@
 name: harfbuzz
-version: 12.3.0
-mtime: 1766867605
-commit: b0af59229cc233a66106c696534ac39be56093d8
+version: 12.3.1
+mtime: 1768946380
+commit: abcb75a5d175c1375c6bed2184656e5738f88ffd
 

Reply via email to