From 7b841047207c40b70590ab59c11be898a41504c2 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sat, 4 May 2019 08:13:22 +0200 Subject: [PATCH] Various clang 8.0 static analyzer fixes. Reported by Sender Ghost . * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Catch a corner case where `edge->first' could be NULL. * src/pfr/pfrobjs.c (pfr_slot_load): Remove unnecessary test of `size'. * src/raster/ftraster.c (Draw_Sweep): Catch a corner case where `draw_right' might be NULL. * src/sfnt/ttmtx.c (tt_face_get_metrics): Fix limit test for `aadvance'. Ensure `abearing' always hold a meaningful result. * src/truetype/ttgload.c (load_truetype_glyph): Ensure `subglyph' is not NULL before accessing it. * src/truetype/ttgxvar.c (TT_Set_Named_Instance): Remove unnecessary test of `namedstyle'. * src/type42/t42parse.c (t42_parser_done): Ensure `parser->root.funcs.done' is not NULL before accessing it. --- ChangeLog | 27 +++++++++++++++++++++++++++ src/autofit/afcjk.c | 5 ++++- src/cache/rules.mk | 2 +- src/pfr/pfrobjs.c | 2 +- src/raster/ftraster.c | 6 ++++++ src/sfnt/ttmtx.c | 6 ++++-- src/truetype/ttgload.c | 1 + src/truetype/ttgxvar.c | 2 +- src/type42/t42parse.c | 3 ++- 9 files changed, 47 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 56db60a40..9f26035b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,30 @@ +2019-05-04 Werner Lemberg + + Various clang 8.0 static analyzer fixes. + + Reported by Sender Ghost . + + * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Catch a corner + case where `edge->first' could be NULL. + + * src/pfr/pfrobjs.c (pfr_slot_load): Remove unnecessary test of + `size'. + + * src/raster/ftraster.c (Draw_Sweep): Catch a corner case where + `draw_right' might be NULL. + + * src/sfnt/ttmtx.c (tt_face_get_metrics): Fix limit test for + `aadvance'. + Ensure `abearing' always hold a meaningful result. + + * src/truetype/ttgload.c (load_truetype_glyph): Ensure `subglyph' is + not NULL before accessing it. + * src/truetype/ttgxvar.c (TT_Set_Named_Instance): Remove unnecessary + test of `namedstyle'. + + * src/type42/t42parse.c (t42_parser_done): Ensure + `parser->root.funcs.done' is not NULL before accessing it. + 2019-05-03 Alexei Podtelezhnikov Miscellaneous macro updates. diff --git a/src/autofit/afcjk.c b/src/autofit/afcjk.c index 3b2b1cf24..a61689bee 100644 --- a/src/autofit/afcjk.c +++ b/src/autofit/afcjk.c @@ -1184,6 +1184,8 @@ seg = edge->first; + if ( !seg ) + goto Skip_Loop; do { @@ -1239,13 +1241,14 @@ edge2->flags |= AF_EDGE_SERIF; } else - edge->link = edge2; + edge->link = edge2; } seg = seg->edge_next; } while ( seg != edge->first ); + Skip_Loop: /* set the round/straight flags */ edge->flags = AF_EDGE_NORMAL; diff --git a/src/cache/rules.mk b/src/cache/rules.mk index abcb24223..1618d9830 100644 --- a/src/cache/rules.mk +++ b/src/cache/rules.mk @@ -15,7 +15,7 @@ # Cache driver directory # -CACHE_DIR := $(SRC_DIR)/cache +CACHE_DIR := $(SRC_DIR)/cache # compilation flags for the driver diff --git a/src/pfr/pfrobjs.c b/src/pfr/pfrobjs.c index e103a3f6f..9765f95c2 100644 --- a/src/pfr/pfrobjs.c +++ b/src/pfr/pfrobjs.c @@ -378,7 +378,7 @@ outline->flags &= ~FT_OUTLINE_OWNER; outline->flags |= FT_OUTLINE_REVERSE_FILL; - if ( size && pfrsize->metrics.y_ppem < 24 ) + if ( pfrsize->metrics.y_ppem < 24 ) outline->flags |= FT_OUTLINE_HIGH_PRECISION; /* compute the advance vector */ diff --git a/src/raster/ftraster.c b/src/raster/ftraster.c index 2859113a3..e8421755a 100644 --- a/src/raster/ftraster.c +++ b/src/raster/ftraster.c @@ -2778,6 +2778,12 @@ Sort( &draw_left ); Sort( &draw_right ); + if ( !draw_right ) + { + ras.error = FT_THROW( Invalid ); + return FAILURE; + } + y_change = (Short)ras.sizeBuff[-ras.numTurns--]; y_height = (Short)( y_change - y ); diff --git a/src/sfnt/ttmtx.c b/src/sfnt/ttmtx.c index 7a4d2be2c..b6725c962 100644 --- a/src/sfnt/ttmtx.c +++ b/src/sfnt/ttmtx.c @@ -280,7 +280,7 @@ else { table_pos += 4 * ( k - 1 ); - if ( table_pos + 4 > table_end ) + if ( table_pos + 2 > table_end ) goto NoData; if ( FT_STREAM_SEEK( table_pos ) || @@ -292,7 +292,9 @@ *abearing = 0; else { - if ( !FT_STREAM_SEEK( table_pos ) ) + if ( FT_STREAM_SEEK( table_pos ) ) + *abearing = 0; + else (void)FT_READ_SHORT( *abearing ); } } diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index cbee27aa6..501ddc783 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -2088,6 +2088,7 @@ loader->ins_pos = ins_pos; if ( IS_HINTED( loader->load_flags ) && #ifdef TT_USE_BYTECODE_INTERPRETER + subglyph && subglyph->flags & WE_HAVE_INSTR && #endif num_points > start_point ) diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c index 6854d2300..0b015b5e6 100644 --- a/src/truetype/ttgxvar.c +++ b/src/truetype/ttgxvar.c @@ -3054,7 +3054,7 @@ if ( instance_index > num_instances ) goto Exit; - if ( instance_index > 0 && mmvar->namedstyle ) + if ( instance_index > 0 ) { FT_Memory memory = face->root.memory; SFNT_Service sfnt = (SFNT_Service)face->sfnt; diff --git a/src/type42/t42parse.c b/src/type42/t42parse.c index b653a133a..a4aefcf63 100644 --- a/src/type42/t42parse.c +++ b/src/type42/t42parse.c @@ -226,7 +226,8 @@ if ( !parser->in_memory ) FT_FREE( parser->base_dict ); - parser->root.funcs.done( &parser->root ); + if ( parser->root.funcs.done ) + parser->root.funcs.done( &parser->root ); }