external/freetype/UnpackedTarball_freetype.mk |    3 
 external/freetype/ubsan.patch                 |  114 ++++++++++++++++++++++++++
 2 files changed, 117 insertions(+)

New commits:
commit 982ecf4407854208a909898b8a69b1d8ca35d519
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Thu Jan 6 08:47:22 2022 +0100
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Fri Jan 7 09:47:46 2022 +0100

    Silence various UBSan warnings in external/freetype
    
    > workdir/UnpackedTarball/freetype/src/autofit/aflatin.c:1992:44: runtime 
error: applying zero offset to null pointer
    
    etc. seen during CppunitTest_sd_misc_tests etc.
    
    Change-Id: Id85c4331f9a892d99e4f3b9cae37b4ffe8c53973
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128034
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/external/freetype/UnpackedTarball_freetype.mk 
b/external/freetype/UnpackedTarball_freetype.mk
index 6f724d1776fc..076edb9e3d97 100644
--- a/external/freetype/UnpackedTarball_freetype.mk
+++ b/external/freetype/UnpackedTarball_freetype.mk
@@ -13,6 +13,9 @@ $(eval $(call 
gb_UnpackedTarball_set_tarball,freetype,$(FREETYPE_TARBALL),,freet
 
 $(eval $(call gb_UnpackedTarball_add_patches,freetype,\
        external/freetype/freetype-2.6.5.patch.1 \
+       external/freetype/ubsan.patch \
 ))
 
+$(eval $(call gb_UnpackedTarball_set_patchlevel,freetype,0))
+
 # vim: set noet sw=4 ts=4:
diff --git a/external/freetype/ubsan.patch b/external/freetype/ubsan.patch
new file mode 100644
index 000000000000..27a36eb880bd
--- /dev/null
+++ b/external/freetype/ubsan.patch
@@ -0,0 +1,114 @@
+--- src/autofit/afcjk.c
++++ src/autofit/afcjk.c
+@@ -843,7 +843,7 @@
+   {
+     AF_AxisHints  axis          = &hints->axis[dim];
+     AF_Segment    segments      = axis->segments;
+-    AF_Segment    segment_limit = segments + axis->num_segments;
++    AF_Segment    segment_limit = axis->num_segments == 0 ? segments : 
segments + axis->num_segments;
+     AF_Direction  major_dir     = axis->major_dir;
+     AF_Segment    seg1, seg2;
+     FT_Pos        len_threshold;
+@@ -1005,7 +1005,7 @@
+     AF_CJKAxis    laxis  = &((AF_CJKMetrics)hints->metrics)->axis[dim];
+ 
+     AF_Segment    segments      = axis->segments;
+-    AF_Segment    segment_limit = segments + axis->num_segments;
++    AF_Segment    segment_limit = axis->num_segments == 0 ? segments : 
segments + axis->num_segments;
+     AF_Segment    seg;
+ 
+     FT_Fixed      scale;
+@@ -1153,7 +1153,7 @@
+      */
+     {
+       AF_Edge  edges      = axis->edges;
+-      AF_Edge  edge_limit = edges + axis->num_edges;
++      AF_Edge  edge_limit = axis->num_edges == 0 ? edges : edges + 
axis->num_edges;
+       AF_Edge  edge;
+ 
+ 
+@@ -1291,7 +1291,7 @@
+   {
+     AF_AxisHints  axis       = &hints->axis[dim];
+     AF_Edge       edge       = axis->edges;
+-    AF_Edge       edge_limit = edge + axis->num_edges;
++    AF_Edge       edge_limit = axis->num_edges == 0 ? edge : edge + 
axis->num_edges;
+     AF_CJKAxis    cjk        = &metrics->axis[dim];
+     FT_Fixed      scale      = cjk->scale;
+     FT_Pos        best_dist0;  /* initial threshold */
+@@ -1798,7 +1798,7 @@
+   {
+     AF_AxisHints  axis       = &hints->axis[dim];
+     AF_Edge       edges      = axis->edges;
+-    AF_Edge       edge_limit = edges + axis->num_edges;
++    AF_Edge       edge_limit = axis->num_edges == 0 ? edges : edges + 
axis->num_edges;
+     FT_PtrDist    n_edges;
+     AF_Edge       edge;
+     AF_Edge       anchor   = NULL;
+@@ -2177,7 +2177,7 @@
+   {
+     AF_AxisHints  axis       = & hints->axis[dim];
+     AF_Edge       edges      = axis->edges;
+-    AF_Edge       edge_limit = edges + axis->num_edges;
++    AF_Edge       edge_limit = axis->num_edges == 0 ? edges : edges + 
axis->num_edges;
+     AF_Edge       edge;
+     FT_Bool       snapping;
+ 
+--- src/autofit/afhints.c
++++ src/autofit/afhints.c
+@@ -1316,7 +1316,7 @@
+   {
+     AF_AxisHints  axis          = & hints->axis[dim];
+     AF_Segment    segments      = axis->segments;
+-    AF_Segment    segment_limit = segments + axis->num_segments;
++    AF_Segment    segment_limit = axis->num_segments == 0 ? segments : 
segments + axis->num_segments;
+     AF_Segment    seg;
+ 
+ 
+@@ -1393,7 +1393,7 @@
+     AF_Point      point_limit = points + hints->num_points;
+     AF_AxisHints  axis        = &hints->axis[dim];
+     AF_Edge       edges       = axis->edges;
+-    AF_Edge       edge_limit  = edges + axis->num_edges;
++    AF_Edge       edge_limit  = axis->num_edges == 0 ? edges : edges + 
axis->num_edges;
+     FT_UInt       touch_flag;
+ 
+ 
+--- src/autofit/aflatin.c
++++ src/autofit/aflatin.c
+@@ -1989,7 +1989,7 @@
+   {
+     AF_AxisHints  axis          = &hints->axis[dim];
+     AF_Segment    segments      = axis->segments;
+-    AF_Segment    segment_limit = segments + axis->num_segments;
++    AF_Segment    segment_limit = axis->num_segments == 0 ? segments : 
segments + axis->num_segments;
+     FT_Pos        len_threshold, len_score, dist_score, max_width;
+     AF_Segment    seg1, seg2;
+ 
+@@ -2134,7 +2134,7 @@
+     FT_Bool  top_to_bottom_hinting = 0;
+ 
+     AF_Segment    segments      = axis->segments;
+-    AF_Segment    segment_limit = segments + axis->num_segments;
++    AF_Segment    segment_limit = axis->num_segments == 0 ? segments : 
segments + axis->num_segments;
+     AF_Segment    seg;
+ 
+ #if 0
+@@ -2500,7 +2500,7 @@
+   {
+     AF_AxisHints  axis       = &hints->axis[AF_DIMENSION_VERT];
+     AF_Edge       edge       = axis->edges;
+-    AF_Edge       edge_limit = edge + axis->num_edges;
++    AF_Edge       edge_limit = axis->num_edges == 0 ? edge : edge + 
axis->num_edges;
+     AF_LatinAxis  latin      = &metrics->axis[AF_DIMENSION_VERT];
+     FT_Fixed      scale      = latin->scale;
+ 
+@@ -2993,7 +2993,7 @@
+   {
+     AF_AxisHints  axis       = &hints->axis[dim];
+     AF_Edge       edges      = axis->edges;
+-    AF_Edge       edge_limit = edges + axis->num_edges;
++    AF_Edge       edge_limit = axis->num_edges == 0 ? edges : edges + 
axis->num_edges;
+     FT_PtrDist    n_edges;
+     AF_Edge       edge;
+     AF_Edge       anchor     = NULL;

Reply via email to