Index: ChangeLog =================================================================== RCS file: /mirrors/freedesktop/cairo/cairo/ChangeLog,v retrieving revision 1.893 diff -u -p -r1.893 ChangeLog --- ChangeLog 15 Aug 2005 02:25:05 -0000 1.893 +++ ChangeLog 16 Aug 2005 19:36:28 -0000 @@ -1,3 +1,15 @@ +2005-08-16 Carl Worth + + Fixes for bug #4110: + + * src/cairo-ft-font.c (_cairo_ft_unscaled_font_init): Don't call + _cairo_ft_unscaled_font_init_key in the from_face case, just clear + filename and id instead. Initialize unscaled->base first so that + initialization order matches the structure declaration order. + + * src/cairo-cache.c (_cairo_hash_string): Fix to accept a NULL + string and hash it identically to a zero-length string. + 2005-08-14 Kristian Høgsberg * src/cairo-ft-font.c (_cairo_ft_unscaled_font_lock_face): Zero Index: src/cairo-cache.c =================================================================== RCS file: /mirrors/freedesktop/cairo/cairo/src/cairo-cache.c,v retrieving revision 1.13 diff -u -p -r1.13 cairo-cache.c --- src/cairo-cache.c 26 Jun 2005 06:24:19 -0000 1.13 +++ src/cairo-cache.c 16 Aug 2005 17:30:15 -0000 @@ -512,7 +512,7 @@ _cairo_hash_string (const char *c) { /* This is the djb2 hash. */ unsigned long hash = 5381; - while (*c) + while (c && *c) hash = ((hash << 5) + hash) + *c++; return hash; } Index: src/cairo-ft-font.c =================================================================== RCS file: /mirrors/freedesktop/cairo/cairo/src/cairo-ft-font.c,v retrieving revision 1.101 diff -u -p -r1.101 cairo-ft-font.c --- src/cairo-ft-font.c 15 Aug 2005 02:25:05 -0000 1.101 +++ src/cairo-ft-font.c 16 Aug 2005 18:37:47 -0000 @@ -248,8 +248,8 @@ _cairo_ft_unscaled_font_map_unlock (void static void _cairo_ft_unscaled_font_init_key (cairo_ft_unscaled_font_t *key, - char *filename, - int id) + char *filename, + int id) { unsigned long hash; @@ -259,7 +259,7 @@ _cairo_ft_unscaled_font_init_key (cairo_ /* 1607 is just an arbitrary prime. */ hash = _cairo_hash_string (filename); hash += ((unsigned long) id) * 1607; - + key->base.hash_entry.hash = hash; } @@ -290,22 +290,25 @@ _cairo_ft_unscaled_font_init (cairo_ft_u int id, FT_Face face) { - char *filename_copy = NULL; - - if (filename) { - filename_copy = strdup (filename); - if (filename_copy == NULL) - return CAIRO_STATUS_NO_MEMORY; - } - - _cairo_ft_unscaled_font_init_key (unscaled, filename_copy, id); + _cairo_unscaled_font_init (&unscaled->base, + &cairo_ft_unscaled_font_backend); if (face) { - unscaled->from_face = 1; + unscaled->from_face = TRUE; unscaled->face = face; + unscaled->filename = NULL; + unscaled->id = 0; } else { - unscaled->from_face = 0; + char *filename_copy; + + unscaled->from_face = FALSE; unscaled->face = NULL; + + filename_copy = strdup (filename); + if (filename_copy == NULL) + return CAIRO_STATUS_NO_MEMORY; + + _cairo_ft_unscaled_font_init_key (unscaled, filename_copy, id); } unscaled->have_scale = 0; @@ -313,9 +316,6 @@ _cairo_ft_unscaled_font_init (cairo_ft_u unscaled->faces = NULL; - _cairo_unscaled_font_init (&unscaled->base, - &cairo_ft_unscaled_font_backend); - return CAIRO_STATUS_SUCCESS; }