Firefox · Core
CVE-2026-118009
Logic Error in Core
Overview
High
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Files Changed
modules/freetype2/include/freetype/config/ftmodule.hmodules/freetype2/include/freetype/config/ftoption.hmodules/freetype2/include/freetype/freetype.hmodules/freetype2/include/freetype/ftimage.hmodules/freetype2/include/freetype/ftmoderr.hmodules/freetype2/include/freetype/fttypes.hmodules/freetype2/include/freetype/internal/ftcalc.hmodules/freetype2/include/freetype/internal/ftdebug.hmodules/freetype2/include/freetype/internal/ftmmtypes.hmodules/freetype2/include/freetype/internal/ftobjs.hmodules/freetype2/include/freetype/internal/ftserv.hmodules/freetype2/include/freetype/internal/fttrace.hmodules/freetype2/include/freetype/internal/services/svfntfmt.hmodules/freetype2/include/freetype/internal/services/svttcmap.hmodules/freetype2/include/freetype/internal/services/svvarc.hmodules/freetype2/include/freetype/internal/tttypes.hmodules/freetype2/include/freetype/tttags.hmodules/freetype2/modules.cfgmodules/freetype2/moz.buildmodules/freetype2/moz.yamlmodules/freetype2/patches/0002-Bug-2032043-cherry-pick-upstream-1803559c.patchmodules/freetype2/patches/0003-Bug-2038537-truetype-interpreter-fixes.patchmodules/freetype2/src/autofit/afgsub.cmodules/freetype2/src/autofit/aflatin.cmodules/freetype2/src/autofit/afranges.cmodules/freetype2/src/autofit/hb-script-list.hmodules/freetype2/src/base/ftbbox.cmodules/freetype2/src/base/ftbitmap.cmodules/freetype2/src/base/ftcalc.cmodules/freetype2/src/base/ftobjs.cmodules/freetype2/src/base/ftoutln.cmodules/freetype2/src/base/ftstroke.cmodules/freetype2/src/cff/cffdrivr.cmodules/freetype2/src/cff/cffgload.cmodules/freetype2/src/cff/cffload.cmodules/freetype2/src/cff/cffobjs.cmodules/freetype2/src/cid/cidload.cmodules/freetype2/src/gzip/README.freetypemodules/freetype2/src/gzip/crc32.cmodules/freetype2/src/gzip/zlib.hmodules/freetype2/src/hvf/hvf.cmodules/freetype2/src/hvf/hvfdrv.cmodules/freetype2/src/hvf/hvfdrv.hmodules/freetype2/src/hvf/hvferror.hmodules/freetype2/src/hvf/hvfload.cmodules/freetype2/src/hvf/hvfload.hmodules/freetype2/src/hvf/hvfobjs.cmodules/freetype2/src/hvf/hvfobjs.hmodules/freetype2/src/hvf/module.mkmodules/freetype2/src/hvf/rules.mkmodules/freetype2/src/otvalid/otvmath.cmodules/freetype2/src/pcf/pcfdrivr.cmodules/freetype2/src/pcf/pcfread.cmodules/freetype2/src/pfr/pfrobjs.cmodules/freetype2/src/psaux/psintrp.cmodules/freetype2/src/psaux/psstack.cmodules/freetype2/src/raster/ftraster.cmodules/freetype2/src/sdf/ftsdf.cmodules/freetype2/src/sfnt/sfobjs.cmodules/freetype2/src/sfnt/sfwoff.cmodules/freetype2/src/sfnt/ttbdf.cmodules/freetype2/src/sfnt/ttcmap.cmodules/freetype2/src/sfnt/ttcmap.hmodules/freetype2/src/sfnt/ttcmapc.hmodules/freetype2/src/sfnt/ttcolr.cmodules/freetype2/src/sfnt/ttload.cmodules/freetype2/src/sfnt/ttmtx.cmodules/freetype2/src/sfnt/ttpost.cmodules/freetype2/src/sfnt/ttsbit.cmodules/freetype2/src/smooth/ftgrays.cmodules/freetype2/src/smooth/ftsmooth.cmodules/freetype2/src/truetype/rules.mkmodules/freetype2/src/truetype/truetype.cmodules/freetype2/src/truetype/ttdriver.cmodules/freetype2/src/truetype/ttgload.cmodules/freetype2/src/truetype/ttgxvar.cmodules/freetype2/src/truetype/ttgxvar.hmodules/freetype2/src/truetype/ttinterp.cmodules/freetype2/src/truetype/ttinterp.hmodules/freetype2/src/truetype/ttobjs.cmodules/freetype2/src/truetype/ttobjs.hmodules/freetype2/src/truetype/ttpload.cmodules/freetype2/src/truetype/ttvarc.cmodules/freetype2/src/truetype/ttvarc.hmodules/freetype2/src/type1/t1load.cmodules/freetype2/src/type1/t1parse.cmodules/freetype2/src/winfonts/winfnt.c
Patch
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…
References
On This Page