* include/freetype/cache/ftcglyph.h, src/cache/ftcglyph.c:
fixed a dangling pointer bug that happened in very rare cases: i.e. when a new family object was destroyed by an out-of-memory condition during a glyph node initialization. The function FTC_Cache_Lookup would flush the cache and restart the lookup with a bad pointer. * src/cache/ftcmanag.c: fixed a cache flushing bug
This commit is contained in:
parent
43f0e26c8e
commit
5ab4136317
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2004-07-17 David Turner <david@freetype.org>
|
||||
|
||||
* include/freetype/cache/ftcglyph.h, src/cache/ftcglyph.c:
|
||||
fixed a dangling pointer bug that happened in very rare cases:
|
||||
i.e. when a new family object was destroyed by an out-of-memory
|
||||
condition during a glyph node initialization. The function
|
||||
FTC_Cache_Lookup would flush the cache and restart the lookup
|
||||
with a bad pointer.
|
||||
|
||||
* src/cache/ftcmanag.c: fixed a cache flushing bug
|
||||
|
||||
2004-07-15 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
* docs/CHANGES: Updated.
|
||||
|
|
|
@ -255,6 +255,12 @@ FT_BEGIN_HEADER
|
|||
FTC_Node *anode );
|
||||
|
||||
|
||||
/* */
|
||||
#define FTC_FAMILY_FREE(family,cache) \
|
||||
FTC_MruList_Remove( &FTC_GCACHE((cache))->families, \
|
||||
(FTC_MruNode)(family) )
|
||||
|
||||
|
||||
#ifdef FTC_INLINE
|
||||
|
||||
#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \
|
||||
|
@ -270,7 +276,16 @@ FT_BEGIN_HEADER
|
|||
FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \
|
||||
_gquery->family, error ); \
|
||||
if ( !error ) \
|
||||
{ \
|
||||
FTC_Family _gqfamily = _gquery->family; \
|
||||
\
|
||||
_gqfamily->num_nodes++; \
|
||||
\
|
||||
FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \
|
||||
\
|
||||
if ( --_gqfamily->num_nodes == 0 ) \
|
||||
FTC_FAMILY_FREE( _gqfamily, _gcache ); \
|
||||
} \
|
||||
FT_END_STMNT
|
||||
/* */
|
||||
|
||||
|
|
|
@ -436,7 +436,7 @@ FT_BEGIN_HEADER
|
|||
/* Do not #undef this macro here, since the build system might */
|
||||
/* define it for certain configurations only. */
|
||||
/* */
|
||||
/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
|
||||
#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "ftcerror.h"
|
||||
|
||||
|
||||
|
||||
/* create a new chunk node, setting its cache index and ref count */
|
||||
FT_EXPORT_DEF( void )
|
||||
FTC_GNode_Init( FTC_GNode gnode,
|
||||
|
@ -48,8 +49,7 @@
|
|||
|
||||
gnode->family = NULL;
|
||||
if ( family && --family->num_nodes <= 0 )
|
||||
FTC_MruList_Remove( &FTC_GCACHE( cache )->families,
|
||||
(FTC_MruNode)family );
|
||||
FTC_FAMILY_FREE( family, cache );
|
||||
}
|
||||
|
||||
|
||||
|
@ -180,8 +180,19 @@
|
|||
|
||||
FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error );
|
||||
if ( !error )
|
||||
{
|
||||
FTC_Family family = query->family;
|
||||
|
||||
/* prevent the family from being destroyed too early when an out-of-memory
|
||||
* condition occurs during glyph node initialization.
|
||||
*/
|
||||
family->num_nodes++;
|
||||
|
||||
error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode );
|
||||
|
||||
if ( --family->num_nodes <= 0 )
|
||||
FTC_FAMILY_FREE( family, cache );
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
@ -639,7 +639,7 @@
|
|||
result++;
|
||||
}
|
||||
|
||||
if ( prev == manager->nodes_list )
|
||||
if ( node == first )
|
||||
break;
|
||||
|
||||
node = prev;
|
||||
|
|
|
@ -2474,7 +2474,7 @@
|
|||
W = Vx * Vx + Vy * Vy;
|
||||
|
||||
/* Now, we want that Sqrt( W ) = 0x4000 */
|
||||
/* Or 0x1000000 <= W < 0x1004000 */
|
||||
/* Or 0x10000000 <= W < 0x10004000 */
|
||||
|
||||
if ( Vx < 0 )
|
||||
{
|
||||
|
@ -2492,7 +2492,7 @@
|
|||
else
|
||||
S2 = FALSE;
|
||||
|
||||
while ( W < 0x1000000L )
|
||||
while ( W < 0x10000000L )
|
||||
{
|
||||
/* We need to increase W by a minimal amount */
|
||||
if ( Vx < Vy )
|
||||
|
@ -2503,7 +2503,7 @@
|
|||
W = Vx * Vx + Vy * Vy;
|
||||
}
|
||||
|
||||
while ( W >= 0x1004000L )
|
||||
while ( W >= 0x10004000L )
|
||||
{
|
||||
/* We need to decrease W by a minimal amount */
|
||||
if ( Vx < Vy )
|
||||
|
|
Loading…
Reference in New Issue