From 8d22746c9e5af80ff4304aef440986403a5072e2 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sat, 12 Jun 2010 01:32:20 +0200 Subject: [PATCH] Fix Savannah bug #30106. Point numbers for FreeType's implementation of hinting masks are collected before the final number of points of a glyph has been determined; in particular, the code for handling the `endchar' opcode can reduce the number of points. * src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Assure that `end_point' is not larger than `glyph->num_points'. --- ChangeLog | 12 ++++++++++++ src/pshinter/pshalgo.c | 12 +++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 13755a095..d75d2f9a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2010-06-11 Werner Lemberg + + Fix Savannah bug #30106. + + Point numbers for FreeType's implementation of hinting masks are + collected before the final number of points of a glyph has been + determined; in particular, the code for handling the `endchar' + opcode can reduce the number of points. + + * src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Assure that + `end_point' is not larger than `glyph->num_points'. + 2010-06-11 Werner Lemberg [cff]: Improve debugging output. diff --git a/src/pshinter/pshalgo.c b/src/pshinter/pshalgo.c index 417dcee54..4b0878594 100644 --- a/src/pshinter/pshalgo.c +++ b/src/pshinter/pshalgo.c @@ -4,7 +4,8 @@ /* */ /* PostScript hinting algorithm (body). */ /* */ -/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 */ +/* by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -1690,7 +1691,10 @@ /* process secondary hints to `selected' points */ if ( num_masks > 1 && glyph->num_points > 0 ) { - first = mask->end_point; + /* the `endchar' op can reduce the number of points */ + first = mask->end_point > glyph->num_points + ? glyph->num_points + : mask->end_point; mask++; for ( ; num_masks > 1; num_masks--, mask++ ) { @@ -1698,7 +1702,9 @@ FT_Int count; - next = mask->end_point; + next = mask->end_point > glyph->num_points + ? glyph->num_points + : mask->end_point; count = next - first; if ( count > 0 ) {