From 982ecf4407854208a909898b8a69b1d8ca35d519 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Thu, 6 Jan 2022 08:47:22 +0100 Subject: 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 --- external/freetype/UnpackedTarball_freetype.mk | 3 + external/freetype/ubsan.patch | 114 ++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 external/freetype/ubsan.patch (limited to 'external') 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; -- cgit