Make fccache more resilient to broken cache files by checking return value

of FcCacheReadString all the time.
reviewed by: plam
This commit is contained in:
Patrick Lam 2006-01-30 15:44:13 +00:00
parent 946478e1a7
commit c5411c4cae
2 changed files with 23 additions and 14 deletions

View File

@ -1,3 +1,12 @@
2006-01-30 Mike Fabian <mfabian@suse.de>
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 <fcrozat@mandriva.com> 2006-01-30 Frederic Crozat <fcrozat@mandriva.com>
reviewed by: plam reviewed by: plam

View File

@ -218,7 +218,8 @@ FcGlobalCacheLoad (FcGlobalCache *cache,
cache->updated = FcFalse; 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) if (strcmp (name_buf, FC_GLOBAL_MAGIC_COOKIE) != 0)
return; return;
@ -229,8 +230,9 @@ FcGlobalCacheLoad (FcGlobalCache *cache,
goto bail_and_destroy; goto bail_and_destroy;
lseek (cache->fd, current_arch_start, SEEK_SET); lseek (cache->fd, current_arch_start, SEEK_SET);
FcCacheReadString (cache->fd, candidate_arch_machine_name, if (!FcCacheReadString (cache->fd, candidate_arch_machine_name,
sizeof (candidate_arch_machine_name)); sizeof (candidate_arch_machine_name)))
goto bail_and_destroy;
if (strlen(candidate_arch_machine_name) == 0) if (strlen(candidate_arch_machine_name) == 0)
goto bail_and_destroy; goto bail_and_destroy;
@ -238,8 +240,7 @@ FcGlobalCacheLoad (FcGlobalCache *cache,
{ {
off_t targ; off_t targ;
FcCacheReadString (cache->fd, name_buf, sizeof (name_buf)); if (!FcCacheReadString (cache->fd, name_buf, sizeof (name_buf)) || !strlen(name_buf))
if (!strlen(name_buf))
break; break;
/* Directory must be older than the global cache file; also /* Directory must be older than the global cache file; also
@ -721,8 +722,7 @@ FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config)
return FcTrue; return FcTrue;
} }
FcCacheReadString (fd, name_buf, sizeof (name_buf)); if (!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || !strlen(name_buf))
if (!strlen(name_buf))
{ {
FcStrFree ((FcChar8 *)cache_hashed); FcStrFree ((FcChar8 *)cache_hashed);
goto bail; goto bail;
@ -943,8 +943,7 @@ FcDirCacheOpen (const FcChar8 *dir)
FcStrFree ((FcChar8 *)cache_file); FcStrFree ((FcChar8 *)cache_file);
return -1; return -1;
} }
FcCacheReadString (fd, name_buf, sizeof (name_buf)); if (!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || !strlen(name_buf))
if (!strlen(name_buf))
goto bail; goto bail;
name_buf_dir = FcStrDirname ((FcChar8 *)name_buf); 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) sizeof (candidate_arch_machine_name)) == 0)
goto bail1; goto bail1;
while (strlen(FcCacheReadString (fd, subdirName, sizeof (subdirName))) > 0) while (FcCacheReadString (fd, subdirName, sizeof (subdirName)) && strlen (subdirName) > 0)
FcStrSetAdd (dirs, (FcChar8 *)subdirName); FcStrSetAdd (dirs, (FcChar8 *)subdirName);
if (!FcDirCacheConsume (fd, (const char *)dir, set, config)) 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); fd = open(cache_hashed, O_RDONLY);
if (fd == -1) if (fd == -1)
break; break;
FcCacheReadString (fd, name_buf, sizeof (name_buf)); if(!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || !strlen(name_buf))
{
close (fd); close (fd);
if (!strlen(name_buf))
break; break;
}
close (fd);
if (strcmp (name_buf, cache_file) != 0) if (strcmp (name_buf, cache_file) != 0)
continue; continue;