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
