From c5411c4cae9389ad875fbbeedeaba0644f5e399f Mon Sep 17 00:00:00 2001 From: Patrick Lam Date: Mon, 30 Jan 2006 15:44:13 +0000 Subject: [PATCH] Make fccache more resilient to broken cache files by checking return value of FcCacheReadString all the time. reviewed by: plam --- ChangeLog | 9 +++++++++ src/fccache.c | 28 ++++++++++++++-------------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index c94e800..4755e7f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2006-01-30 Mike Fabian + reviewed by: plam + + * src/fccache.c (FcGlobalCacheLoad, FcDirCacheUnlink + FcDirCacheOpen, FcDirCacheRead, FcDirCacheWrite): + + Make fccache more resilient to broken cache files by checking + return value of FcCacheReadString all the time. + 2006-01-30 Frederic Crozat reviewed by: plam diff --git a/src/fccache.c b/src/fccache.c index 853ae0e..5af247a 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -218,7 +218,8 @@ FcGlobalCacheLoad (FcGlobalCache *cache, cache->updated = FcFalse; - FcCacheReadString (cache->fd, name_buf, sizeof (name_buf)); + if (!FcCacheReadString (cache->fd, name_buf, sizeof (name_buf))) + return; if (strcmp (name_buf, FC_GLOBAL_MAGIC_COOKIE) != 0) return; @@ -229,8 +230,9 @@ FcGlobalCacheLoad (FcGlobalCache *cache, goto bail_and_destroy; lseek (cache->fd, current_arch_start, SEEK_SET); - FcCacheReadString (cache->fd, candidate_arch_machine_name, - sizeof (candidate_arch_machine_name)); + if (!FcCacheReadString (cache->fd, candidate_arch_machine_name, + sizeof (candidate_arch_machine_name))) + goto bail_and_destroy; if (strlen(candidate_arch_machine_name) == 0) goto bail_and_destroy; @@ -238,8 +240,7 @@ FcGlobalCacheLoad (FcGlobalCache *cache, { off_t targ; - FcCacheReadString (cache->fd, name_buf, sizeof (name_buf)); - if (!strlen(name_buf)) + if (!FcCacheReadString (cache->fd, name_buf, sizeof (name_buf)) || !strlen(name_buf)) break; /* Directory must be older than the global cache file; also @@ -721,8 +722,7 @@ FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config) return FcTrue; } - FcCacheReadString (fd, name_buf, sizeof (name_buf)); - if (!strlen(name_buf)) + if (!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || !strlen(name_buf)) { FcStrFree ((FcChar8 *)cache_hashed); goto bail; @@ -943,8 +943,7 @@ FcDirCacheOpen (const FcChar8 *dir) FcStrFree ((FcChar8 *)cache_file); return -1; } - FcCacheReadString (fd, name_buf, sizeof (name_buf)); - if (!strlen(name_buf)) + if (!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || !strlen(name_buf)) goto bail; name_buf_dir = FcStrDirname ((FcChar8 *)name_buf); @@ -990,7 +989,7 @@ FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir, FcConfig * sizeof (candidate_arch_machine_name)) == 0) goto bail1; - while (strlen(FcCacheReadString (fd, subdirName, sizeof (subdirName))) > 0) + while (FcCacheReadString (fd, subdirName, sizeof (subdirName)) && strlen (subdirName) > 0) FcStrSetAdd (dirs, (FcChar8 *)subdirName); if (!FcDirCacheConsume (fd, (const char *)dir, set, config)) @@ -1130,11 +1129,12 @@ FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir) fd = open(cache_hashed, O_RDONLY); if (fd == -1) break; - FcCacheReadString (fd, name_buf, sizeof (name_buf)); - close (fd); - - if (!strlen(name_buf)) + if(!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || !strlen(name_buf)) + { + close (fd); break; + } + close (fd); if (strcmp (name_buf, cache_file) != 0) continue;