High firefox Logic Error 🔧 Commit mapped

Overview

High
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Impacthigh
DescriptionInteger overflow, use-after-free in the Graphics: Text component
ComponentCore
Bug ClassLogic Error
Tracker2076098
Fix commit78bbb78774ed (firefox) +9691/-1355
CISA KEVNot listed
CreditedNguyen Thanh Nguyen
Disclosed2026-10-27

Files Changed

  • modules/freetype2/include/freetype/config/ftmodule.h
  • modules/freetype2/include/freetype/config/ftoption.h
  • modules/freetype2/include/freetype/freetype.h
  • modules/freetype2/include/freetype/ftimage.h
  • modules/freetype2/include/freetype/ftmoderr.h
  • modules/freetype2/include/freetype/fttypes.h
  • modules/freetype2/include/freetype/internal/ftcalc.h
  • modules/freetype2/include/freetype/internal/ftdebug.h
  • modules/freetype2/include/freetype/internal/ftmmtypes.h
  • modules/freetype2/include/freetype/internal/ftobjs.h
  • modules/freetype2/include/freetype/internal/ftserv.h
  • modules/freetype2/include/freetype/internal/fttrace.h
  • modules/freetype2/include/freetype/internal/services/svfntfmt.h
  • modules/freetype2/include/freetype/internal/services/svttcmap.h
  • modules/freetype2/include/freetype/internal/services/svvarc.h
  • modules/freetype2/include/freetype/internal/tttypes.h
  • modules/freetype2/include/freetype/tttags.h
  • modules/freetype2/modules.cfg
  • modules/freetype2/moz.build
  • modules/freetype2/moz.yaml
  • modules/freetype2/patches/0002-Bug-2032043-cherry-pick-upstream-1803559c.patch
  • modules/freetype2/patches/0003-Bug-2038537-truetype-interpreter-fixes.patch
  • modules/freetype2/src/autofit/afgsub.c
  • modules/freetype2/src/autofit/aflatin.c
  • modules/freetype2/src/autofit/afranges.c
  • modules/freetype2/src/autofit/hb-script-list.h
  • modules/freetype2/src/base/ftbbox.c
  • modules/freetype2/src/base/ftbitmap.c
  • modules/freetype2/src/base/ftcalc.c
  • modules/freetype2/src/base/ftobjs.c
  • modules/freetype2/src/base/ftoutln.c
  • modules/freetype2/src/base/ftstroke.c
  • modules/freetype2/src/cff/cffdrivr.c
  • modules/freetype2/src/cff/cffgload.c
  • modules/freetype2/src/cff/cffload.c
  • modules/freetype2/src/cff/cffobjs.c
  • modules/freetype2/src/cid/cidload.c
  • modules/freetype2/src/gzip/README.freetype
  • modules/freetype2/src/gzip/crc32.c
  • modules/freetype2/src/gzip/zlib.h
  • modules/freetype2/src/hvf/hvf.c
  • modules/freetype2/src/hvf/hvfdrv.c
  • modules/freetype2/src/hvf/hvfdrv.h
  • modules/freetype2/src/hvf/hvferror.h
  • modules/freetype2/src/hvf/hvfload.c
  • modules/freetype2/src/hvf/hvfload.h
  • modules/freetype2/src/hvf/hvfobjs.c
  • modules/freetype2/src/hvf/hvfobjs.h
  • modules/freetype2/src/hvf/module.mk
  • modules/freetype2/src/hvf/rules.mk
  • modules/freetype2/src/otvalid/otvmath.c
  • modules/freetype2/src/pcf/pcfdrivr.c
  • modules/freetype2/src/pcf/pcfread.c
  • modules/freetype2/src/pfr/pfrobjs.c
  • modules/freetype2/src/psaux/psintrp.c
  • modules/freetype2/src/psaux/psstack.c
  • modules/freetype2/src/raster/ftraster.c
  • modules/freetype2/src/sdf/ftsdf.c
  • modules/freetype2/src/sfnt/sfobjs.c
  • modules/freetype2/src/sfnt/sfwoff.c
  • modules/freetype2/src/sfnt/ttbdf.c
  • modules/freetype2/src/sfnt/ttcmap.c
  • modules/freetype2/src/sfnt/ttcmap.h
  • modules/freetype2/src/sfnt/ttcmapc.h
  • modules/freetype2/src/sfnt/ttcolr.c
  • modules/freetype2/src/sfnt/ttload.c
  • modules/freetype2/src/sfnt/ttmtx.c
  • modules/freetype2/src/sfnt/ttpost.c
  • modules/freetype2/src/sfnt/ttsbit.c
  • modules/freetype2/src/smooth/ftgrays.c
  • modules/freetype2/src/smooth/ftsmooth.c
  • modules/freetype2/src/truetype/rules.mk
  • modules/freetype2/src/truetype/truetype.c
  • modules/freetype2/src/truetype/ttdriver.c
  • modules/freetype2/src/truetype/ttgload.c
  • modules/freetype2/src/truetype/ttgxvar.c
  • modules/freetype2/src/truetype/ttgxvar.h
  • modules/freetype2/src/truetype/ttinterp.c
  • modules/freetype2/src/truetype/ttinterp.h
  • modules/freetype2/src/truetype/ttobjs.c
  • modules/freetype2/src/truetype/ttobjs.h
  • modules/freetype2/src/truetype/ttpload.c
  • modules/freetype2/src/truetype/ttvarc.c
  • modules/freetype2/src/truetype/ttvarc.h
  • modules/freetype2/src/type1/t1load.c
  • modules/freetype2/src/type1/t1parse.c
  • modules/freetype2/src/winfonts/winfnt.c
diff --git a/modules/freetype2/include/freetype/config/ftmodule.h b/modules/freetype2/include/freetype/config/ftmodule.h
index b315baba8ae..028e52cc33c 100644
--- a/modules/freetype2/include/freetype/config/ftmodule.h
+++ b/modules/freetype2/include/freetype/config/ftmodule.h
@@ -15,6 +15,7 @@ FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
 FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
 FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )
 FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, hvf_driver_class )
 FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )
 FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )
 FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )
diff --git a/modules/freetype2/include/freetype/config/ftoption.h b/modules/freetype2/include/freetype/config/ftoption.h
index b857e0ebbd9..6d3d7dfaa57 100644
--- a/modules/freetype2/include/freetype/config/ftoption.h
+++ b/modules/freetype2/include/freetype/config/ftoption.h
@@ -334,6 +334,22 @@ FT_BEGIN_HEADER
 /* #define FT_CONFIG_OPTION_USE_BROTLI */
 
 
+  /**************************************************************************
+   *
+   * HVF support.
+   *
+   *   FreeType can use Apple's HVF (Hierarchical Variable Font) library
+   *   to render glyphs from fonts containing 'hvgl' tables.
+   *
+   *   Define this macro if you want to enable this 'feature'.
+   *
+   *   If you use a build system like cmake or the `configure` script,
+   *   options set by those programs have precedence, overwriting the value
+   *   here with the configured one.
+   */
+/* #define FT_CONFIG_OPTION_HVF */
+
+
   /**************************************************************************
    *
    * Glyph Postscript Names handling
@@ -423,8 +439,10 @@ FT_BEGIN_HEADER
 
   /**************************************************************************
    *
-   * The size in bytes of the render pool used by the scan-line converter to
-   * do all of its work.
+   * The size in bytes of the stack render pool used by the scan-line
+   * converters.  Use this option to limit the stack usage.  The memory
+   * requirements are proportional to size and complexity of a given glyph.
+   * FreeType's rasterizers switch to dynamic allocations when necessary.
    */
 #define FT_RENDER_POOL_SIZE  16384L
 
@@ -651,6 +669,7 @@ FT_BEGIN_HEADER
 #define TT_CONFIG_CMAP_FORMAT_12
 #define TT_CONFIG_CMAP_FORMAT_13
 #define TT_CONFIG_CMAP_FORMAT_14
+#define TT_CONFIG_CMAP_FORMAT_15
 
 
   /*************************************************************************/
@@ -756,6 +775,21 @@ FT_BEGIN_HEADER
 /* #define TT_CONFIG_OPTION_NO_BORING_EXPANSION */
 
 
+  /**************************************************************************
+   *
+   * Define `TT_CONFIG_OPTION_VARC` if you want to include support for
+   * variable composite glyphs (the 'VARC' table).  This is part of the
+   * 'boring' OpenType specification expansions.
+   *
+   *   https://github.com/harfbuzz/boring-expansion-spec/blob/main/VARC.md
+   *
+   * Variable composites enable more efficient encoding of variable glyphs
+   * by allowing glyphs to be composed from other glyphs with variable
+   * transformations and axis value overrides.
+   */
+#define TT_CONFIG_OPTION_VARC
+
+
   /**************************************************************************
    *
    * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an
diff --git a/modules/freetype2/include/freetype/freetype.h b/modules/freetype2/include/freetype/freetype.h
index 68a9e0c6bd2..63c0573bc48 100644
--- a/modules/freetype2/include/freetype/freetype.h
+++ b/modules/freetype2/include/freetype/freetype.h
@@ -4134,7 +4134,7 @@ FT_BEGIN_HEADER
    *   This function returns an error if the charmap is not part of the face
    *   (i.e., if it is not listed in the `face->charmaps` table).
    *
-   *   It also fails if an OpenType type~14 charmap is selected (which
+   *   It also fails if an OpenType type 14 or~15 charmap is selected (which
    *   doesn't map character codes to glyph indices at all).
    */
   FT_EXPORT( FT_Error )
@@ -4700,7 +4700,7 @@ FT_BEGIN_HEADER
    *
    * @abstract:
    *   The FreeType~2 interface to Unicode Variation Sequences (UVS), using
-   *   the SFNT cmap format~14.
+   *   the SFNT cmap formats 14 and~15.
    *
    * @description:
    *   Many characters, especially for CJK scripts, have variant forms.  They
@@ -4730,9 +4730,10 @@ FT_BEGIN_HEADER
    *   U+9089, you have to write the character sequence `U+9089 U+E0100`.
    *
    *   Adobe and MS decided to support both standardized and ideographic VS
-   *   with a new cmap subtable (format~14).  It is an odd subtable because
-   *   it is not a mapping of input code points to glyphs, but contains lists
-   *   of all variations supported by the font.
+   *   with a new cmap subtable (format~14, or format~15 for glyph indices
+   *   above 65535).  It is an odd subtable because it is not a mapping of
+   *   input code points to glyphs, but contains lists of all variations
+   *   supported by the font.
    *
    *   A variation may be either 'default' or 'non-default' for a given font.
    *   A default variation is the one you will get for that code point if you
diff --git a/modules/freetype2/include/freetype/ftimage.h b/modules/freetype2/include/freetype/ftimage.h
index 1fff76b20d9..61de54e48cb 100644
--- a/modules/freetype2/include/freetype/ftimage.h
+++ b/modules/freetype2/include/freetype/ftimage.h
@@ -471,7 +471,7 @@ FT_BEGIN_HEADER
 
   /* */
 
-#define FT_CURVE_TAG( flag )  ( flag & 0x03 )
+#define FT_CURVE_TAG( flag )  ( ( flag & 0x01 ) ? 0x01 : ( flag & 0x03 ) )
 
   /* see the `tags` field in `FT_Outline` for a description of the values */
 #define FT_CURVE_TAG_ON            0x01
@@ -875,7 +875,7 @@ FT_BEGIN_HEADER
    */
   typedef struct  FT_Span_
   {
-    unsigned short  x;
+    short           x;
     unsigned short  len;
     unsigned char   coverage;
 
diff --git a/modules/freetype2/include/freetype/ftmoderr.h b/modules/freetype2/include/freetype/ftmoderr.h
index 7c1b1fd3c04..9010c9fc489 100644
--- a/modules/freetype2/include/freetype/ftmoderr.h
+++ b/modules/freetype2/include/freetype/ftmoderr.h
@@ -172,6 +172,7 @@
   FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" )
   FT_MODERRDEF( GXvalid,  0x1600, "GX validation module" )
   FT_MODERRDEF( Sdf,      0x1700, "Signed distance field raster module" )
+  FT_MODERRDEF( HVF,      0x1800, "HVF module" )
 
 
 #ifdef FT_MODERR_END_LIST
diff --git a/modules/freetype2/include/freetype/fttypes.h b/modules/freetype2/include/freetype/fttypes.h
index 97ddcde65aa..2f3ca05955a 100644
--- a/modules/freetype2/include/freetype/fttypes.h
+++ b/modules/freetype2/include/freetype/fttypes.h
@@ -25,8 +25,6 @@
 #include <freetype/ftsystem.h>
 #include <freetype/ftimage.h>
 
-#include <stddef.h>
-
 
 FT_BEGIN_HEADER
 
diff --git a/modules/freetype2/include/freetype/internal/ftcalc.h b/modules/freetype2/include/freetype/internal/ftcalc.h
index 4c4943164a3..129366f3894 100644
--- a/modules/freetype2/include/freetype/internal/ftcalc.h
+++ b/modules/freetype2/include/freetype/internal/ftcalc.h
@@ -77,6 +77,10 @@ FT_BEGIN_HEADER
 #endif /* FT_INT64 */
 
 
+#define ULABS( a )  ( a >= 0 ? (FT_ULong)a : 0UL - (FT_ULong)a )
+#define  UABS( a )  ( a >= 0 ?  (FT_UInt)a : 0U  -  (FT_UInt)a )
+
+
   /**************************************************************************
    *
    * FT_MulDiv() and FT_MulFix() are declared in freetype.h.
diff --git a/modules/freetype2/include/freetype/internal/ftdebug.h b/modules/freetype2/include/freetype/internal/ftdebug.h
index 62b9ec2f79c..1baf5f385a8 100644
--- a/modules/freetype2/include/freetype/internal/ftdebug.h
+++ b/modules/freetype2/include/freetype/internal/ftdebug.h
@@ -33,6 +33,7 @@
 
 #ifdef FT_DEBUG_LOGGING
 #define DLG_STATIC
+#define DLG_LOG_LEVEL  dlg_level_trace
 #include <dlg/output.h>
 #include <dlg/dlg.h>
 
diff --git a/modules/freetype2/include/freetype/internal/ftmmtypes.h b/modules/freetype2/include/freetype/internal/ftmmtypes.h
index a4db9c487b7..854798ad3c0 100644
--- a/modules/freetype2/include/freetype/internal/ftmmtypes.h
+++ b/modules/freetype2/include/freetype/internal/ftmmtypes.h
@@ -71,6 +71,13 @@ FT_BEGIN_HEADER
     FT_UInt       regionCount;          /* total number of regions defined */
     GX_VarRegion  varRegionList;
 
+    /* Cache of per-region scalars for the current normalized coordinates. */
+    /* `regionScalars` holds `regionCount` values, `cachedCoords` the      */
+    /* `axisCount` coordinates they were computed for; both are NULL until */
+    /* first use and recomputed whenever the coordinates change.           */
+    FT_Fixed*  regionScalars;
+    FT_Fixed*  cachedCoords;
+
   } GX_ItemVarStoreRec, *GX_ItemVarStore;
 
 
diff --git a/modules/freetype2/include/freetype/internal/ftobjs.h b/modules/freetype2/include/freetype/internal/ftobjs.h
index 4fa4991dd88..f97262ffa95 100644
--- a/modules/freetype2/include/freetype/internal/ftobjs.h
+++ b/modules/freetype2/include/freetype/internal/ftobjs.h
@@ -214,8 +214,8 @@ FT_BEGIN_HEADER
     FT_CMap_CharIndexFunc  char_index;
     FT_CMap_CharNextFunc   char_next;
 
-    /* Subsequent entries are special ones for format 14 -- the variant */
-    /* selector subtable which behaves like no other                    */
+    /* Subsequent entries are special ones for formats 14 and 15 -- */
+    /* the variant selector subtables which behave like no other    */
 
     FT_CMap_CharVarIndexFunc      char_var_index;
     FT_CMap_CharVarIsDefaultFunc  char_var_default;
diff --git a/modules/freetype2/include/freetype/internal/ftserv.h b/modules/freetype2/include/freetype/internal/ftserv.h
index 9c6406c82d8..3b326627074 100644
--- a/modules/freetype2/include/freetype/internal/ftserv.h
+++ b/modules/freetype2/include/freetype/internal/ftserv.h
@@ -173,6 +173,7 @@ FT_BEGIN_HEADER
    *   FT_DEFINE_SERVICEDESCREC8
    *   FT_DEFINE_SERVICEDESCREC9
    *   FT_DEFINE_SERVICEDESCREC10
+   *   FT_DEFINE_SERVICEDESCREC11
    *
    * @description:
    *   Used to initialize an array of FT_ServiceDescRec structures.
@@ -350,6 +351,34 @@ FT_BEGIN_HEADER
     { NULL, NULL }                                                          \
   };
 
+#define FT_DEFINE_SERVICEDESCREC11( class_,                                 \
+                                    serv_id_1, serv_data_1,                 \
+                                    serv_id_2, serv_data_2,                 \
+                                    serv_id_3, serv_data_3,                 \
+                                    serv_id_4, serv_data_4,                 \
+                                    serv_id_5, serv_data_5,                 \
+                                    serv_id_6, serv_data_6,                 \
+                                    serv_id_7, serv_data_7,                 \
+                                    serv_id_8, serv_data_8,                 \
+                                    serv_id_9, serv_data_9,                 \
+                                    serv_id_10, serv_data_10,               \
+                                    serv_id_11, serv_data_11 )              \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { serv_id_7, serv_data_7 },                                             \
+    { serv_id_8, serv_data_8 },                                             \
+    { serv_id_9, serv_data_9 },                                             \
+    { serv_id_10, serv_data_10 },                                           \
+    { serv_id_11, serv_data_11 },                                           \
+    { NULL, NULL }                                                          \
+  };
+
 
   /*
    * Parse a list of FT_ServiceDescRec descriptors and look for a specific
diff --git a/modules/freetype2/include/freetype/internal/fttrace.h b/modules/freetype2/include/freetype/internal/fttrace.h
index 798896cd0c8..22291ef7cfe 100644
--- a/modules/freetype2/include/freetype/internal/fttrace.h
+++ b/modules/freetype2/include/freetype/internal/fttrace.h
@@ -79,6 +79,7 @@ FT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */
 FT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */
 FT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */
 FT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */
+FT_TRACE_DEF( ttvarc )    /* TT VARC handler         (ttvarc.c)   */
 
   /* Type 1 driver components */
 FT_TRACE_DEF( t1afm )
@@ -120,6 +121,11 @@ FT_TRACE_DEF( cidload )
 FT_TRACE_DEF( cidobjs )
 FT_TRACE_DEF( cidparse )
 
+  /* HVF driver component */
+FT_TRACE_DEF( hvfdrv )
+FT_TRACE_DEF( hvfobjs )
+FT_TRACE_DEF( hvfload )
+
   /* Windows font component */
 FT_TRACE_DEF( winfnt )
 
diff --git a/modules/freetype2/include/freetype/internal/services/svfntfmt.h b/modules/freetype2/include/freetype/internal/services/svfntfmt.h
index 770381da67a..91a6f007aa5 100644
--- a/modules/freetype2/include/freetype/internal/services/svfntfmt.h
+++ b/modules/freetype2/include/freetype/internal/services/svfntfmt.h
@@ -40,6 +40,7 @@ FT_BEGIN_HEADER
 #define FT_FONT_FORMAT_TYPE_42   "Type 42"
 #define FT_FONT_FORMAT_CID       "CID Type 1"
 #define FT_FONT_FORMAT_CFF       "CFF"
+#define FT_FONT_FORMAT_HVF       "HVF"
 #define FT_FONT_FORMAT_PFR       "PFR"
 #define FT_FONT_FORMAT_WINFNT    "Windows FNT"
 
diff --git a/modules/freetype2/include/freetype/internal/services/svttcmap.h b/modules/freetype2/include/freetype/internal/services/svttcmap.h
index 14921304ebf..d7ad8066b5e 100644
--- a/modules/freetype2/include/freetype/internal/services/svttcmap.h
+++ b/modules/freetype2/include/freetype/internal/services/svttcmap.h
@@ -52,7 +52,8 @@ FT_BEGIN_HEADER
    *     table), 2~(high-byte mapping through table), 4~(segment mapping to
    *     delta values), 6~(trimmed table mapping), 8~(mixed 16-bit and 32-bit
    *     coverage), 10~(trimmed array), 12~(segmented coverage), 13~(last
-   *     resort font), and 14 (Unicode Variation Sequences).
+   *     resort font), 14~(Unicode Variation Sequences), and 15~(extended
+   *     glyph repertoire Unicode Variation Sequences).
    */
   typedef struct  TT_CMapInfo_
   {
diff --git a/modules/freetype2/include/freetype/internal/services/svvarc.h b/modules/freetype2/include/freetype/internal/services/svvarc.h
new file mode 100644
index 00000000000..753340904d6
--- /dev/null
+++ b/modules/freetype2/include/freetype/internal/services/svvarc.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+ *
+ * svvarc.h
+ *
+ *   The FreeType VARC service (specification).
+ *
+ * Copyright (C) 2026 by
+ * David Turner, Robert Wilhelm, Werner Lemberg, and Behdad Esfahbod.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT.  By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ */
+
+
+#ifndef SVVARC_H_
+#define SVVARC_H_
+
+
+#include <freetype/internal/ftserv.h>
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_VARC  "varc"
+
+
+  typedef FT_Error
+  (*FT_VARC_Init_Axes_Func)( FT_Face  face,
+                             FT_UInt  axis_count );
+
+  typedef FT_Error
+  (*FT_VARC_Load_Func)( FT_Face    face,
+                        FT_Stream  stream );
+
+  typedef void
+  (*FT_VARC_Done_Func)( FT_Face  face );
+
+  typedef FT_Bool
+  (*FT_VARC_Has_Glyph_Func)( FT_Face  face,
+                             FT_UInt  glyph_index );
+
+  typedef FT_Error
+  (*FT_VARC_Load_Glyph_Func)( FT_Face       face,
+                              FT_GlyphSlot  glyph_slot,
+                              FT_UInt       glyph_index,
+                              FT_Int32      load_flags );
+
+
+  FT_DEFINE_SERVICE( VARC )
+  {
+    FT_VARC_Init_Axes_Func   init_axes;
+    FT_VARC_Load_Func        load;
+    FT_VARC_Done_Func        done;
+    FT_VARC_Has_Glyph_Func   has_glyph;
+    FT_VARC_Load_Glyph_Func  load_glyph;
+  };
+
+
+#define FT_DEFINE_SERVICE_VARCREC( class_,       \
+                                   init_axes_,   \
+                                   load_,        \
+                                   done_,        \
+                                   has_glyph_,   \
+                                   load_glyph_ ) \
+  static const FT_Service_VARCRec  class_ =      \
+  {                                              \
+    init_axes_,                                  \
... (file diff truncated)
Loading diff…