[fontconfig/f19] Fix the race condition issue on updating caches. (#921706)
Akira TAGOH
tagoh at fedoraproject.org
Tue Jul 8 09:33:58 UTC 2014
commit 0a845dd63093e852939cd450a111314f7ca7f1e8
Author: Akira TAGOH <tagoh at redhat.com>
Date: Tue Jul 8 18:34:08 2014 +0900
Fix the race condition issue on updating caches. (#921706)
fontconfig-fix-race-condition.patch | 563 +++++++++++++++++++++++++++++++++++
fontconfig.spec | 7 +-
2 files changed, 569 insertions(+), 1 deletions(-)
---
diff --git a/fontconfig-fix-race-condition.patch b/fontconfig-fix-race-condition.patch
new file mode 100644
index 0000000..0acca9b
--- /dev/null
+++ b/fontconfig-fix-race-condition.patch
@@ -0,0 +1,563 @@
+diff -pruN fontconfig-2.10.93.orig/doc/FcDirCacheRescan.3 fontconfig-2.10.93/doc/FcDirCacheRescan.3
+--- fontconfig-2.10.93.orig/doc/FcDirCacheRescan.3 1970-01-01 09:00:00.000000000 +0900
++++ fontconfig-2.10.93/doc/FcDirCacheRescan.3 2014-07-08 18:10:35.000000000 +0900
+@@ -0,0 +1,17 @@
++.\" auto-generated by docbook2man-spec from docbook-utils package
++.TH "FcDirCacheRescan" "3" "04 7月 2014" "Fontconfig 2.11.1" ""
++.SH NAME
++FcDirCacheRescan \- Re-scan a directory cache
++.SH SYNOPSIS
++.nf
++\fB#include <fontconfig/fontconfig.h>
++.sp
++FcCache * FcDirCacheRescan (const FcChar8 *\fIdir\fB, FcConfig *\fIconfig\fB);
++.fi\fR
++.SH "DESCRIPTION"
++.PP
++Re-scan directories only at \fIdir\fR and update the cache.
++returns NULL if failed.
++.SH "SINCE"
++.PP
++version 2.11.1
+diff -pruN fontconfig-2.10.93.orig/doc/FcStrListFirst.3 fontconfig-2.10.93/doc/FcStrListFirst.3
+--- fontconfig-2.10.93.orig/doc/FcStrListFirst.3 1970-01-01 09:00:00.000000000 +0900
++++ fontconfig-2.10.93/doc/FcStrListFirst.3 2014-07-08 18:29:40.000000000 +0900
+@@ -0,0 +1,16 @@
++.\" auto-generated by docbook2man-spec from docbook-utils package
++.TH "FcStrListFirst" "3" "04 7月 2014" "Fontconfig 2.11.1" ""
++.SH NAME
++FcStrListFirst \- get first string in iteration
++.SH SYNOPSIS
++.nf
++\fB#include <fontconfig/fontconfig.h>
++.sp
++void FcStrListFirst (FcStrList *\fIlist\fB);
++.fi\fR
++.SH "DESCRIPTION"
++.PP
++Returns the first string in \fIlist\fR\&.
++.SH "SINCE"
++.PP
++version 2.11.0
+diff -pruN fontconfig-2.10.93.orig/doc/fcdircache.fncs fontconfig-2.10.93/doc/fcdircache.fncs
+--- fontconfig-2.10.93.orig/doc/fcdircache.fncs 2012-02-20 12:49:18.000000000 +0900
++++ fontconfig-2.10.93/doc/fcdircache.fncs 2014-07-08 18:27:55.000000000 +0900
+@@ -55,6 +55,16 @@ FcDirCacheRead.
+ @@
+
+ @RET@ FcCache *
++ at FUNC@ FcDirCacheRescan
++ at TYPE1@ const FcChar8 * @ARG1@ dir
++ at TYPE2@ FcConfig * @ARG2@ config
++ at PURPOSE@ Re-scan a directory cache
++ at DESC@
++Re-scan directories only at <parameter>dir</parameter> and update the cache.
++returns NULL if failed.
++@@
++
++ at RET@ FcCache *
+ @FUNC@ FcDirCacheRead
+ @TYPE1@ const FcChar8 * @ARG1@ dir
+ @TYPE2@ FcBool% @ARG2@ force
+diff -pruN fontconfig-2.10.93.orig/doc/fcstrset.fncs fontconfig-2.10.93/doc/fcstrset.fncs
+--- fontconfig-2.10.93.orig/doc/fcstrset.fncs 2012-06-01 11:26:09.000000000 +0900
++++ fontconfig-2.10.93/doc/fcstrset.fncs 2014-07-08 18:30:00.000000000 +0900
+@@ -98,12 +98,20 @@ Destroys <parameter>set</parameter>.
+ Creates an iterator to list the strings in <parameter>set</parameter>.
+ @@
+
++ at RET@ void
++ at FUNC@ FcStrListFirst
++ at TYPE1@ FcStrList * @ARG1@ list
++ at PURPOSE@ get first string in iteration
++ at DESC@
++Returns the first string in <parameter>list</parameter>.
++@@
++
+ @RET@ FcChar8 *
+ @FUNC@ FcStrListNext
+ @TYPE1@ FcStrList * @ARG1@ list
+ @PURPOSE@ get next string in iteration
+ @DESC@
+-Returns the next string in <parameter>set</parameter>.
++Returns the next string in <parameter>list</parameter>.
+ @@
+
+ @RET@ void
+diff -pruN fontconfig-2.10.93.orig/fc-cache/fc-cache.c fontconfig-2.10.93/fc-cache/fc-cache.c
+--- fontconfig-2.10.93.orig/fc-cache/fc-cache.c 2013-04-04 12:09:46.000000000 +0900
++++ fontconfig-2.10.93/fc-cache/fc-cache.c 2014-07-08 18:27:56.000000000 +0900
+@@ -118,7 +118,7 @@ usage (char *program, int error)
+ static FcStrSet *processed_dirs;
+
+ static int
+-scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, int *changed)
++scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, FcBool recursive, int *changed, FcStrSet *updateDirs)
+ {
+ int ret = 0;
+ const FcChar8 *dir;
+@@ -137,11 +137,14 @@ scanDirs (FcStrList *list, FcConfig *con
+ {
+ if (verbose)
+ {
+- printf ("%s: ", dir);
++ if (!recursive)
++ printf ("Re-scanning %s: ", dir);
++ else
++ printf ("%s: ", dir);
+ fflush (stdout);
+ }
+
+- if (FcStrSetMember (processed_dirs, dir))
++ if (recursive && FcStrSetMember (processed_dirs, dir))
+ {
+ if (verbose)
+ printf ("skipping, looped directory detected\n");
+@@ -184,8 +187,13 @@ scanDirs (FcStrList *list, FcConfig *con
+
+ if (!cache)
+ {
+- (*changed)++;
+- cache = FcDirCacheRead (dir, FcTrue, config);
++ if (!recursive)
++ cache = FcDirCacheRescan (dir, config);
++ else
++ {
++ (*changed)++;
++ cache = FcDirCacheRead (dir, FcTrue, config);
++ }
+ if (!cache)
+ {
+ fprintf (stderr, "%s: error scanning\n", dir);
+@@ -213,32 +221,39 @@ scanDirs (FcStrList *list, FcConfig *con
+ ret++;
+ }
+ }
+-
+- subdirs = FcStrSetCreate ();
+- if (!subdirs)
++
++ if (recursive)
+ {
+- fprintf (stderr, "%s: Can't create subdir set\n", dir);
+- ret++;
+- FcDirCacheUnload (cache);
+- continue;
+- }
+- for (i = 0; i < FcCacheNumSubdir (cache); i++)
+- FcStrSetAdd (subdirs, FcCacheSubdir (cache, i));
++ subdirs = FcStrSetCreate ();
++ if (!subdirs)
++ {
++ fprintf (stderr, "%s: Can't create subdir set\n", dir);
++ ret++;
++ FcDirCacheUnload (cache);
++ continue;
++ }
++ for (i = 0; i < FcCacheNumSubdir (cache); i++)
++ FcStrSetAdd (subdirs, FcCacheSubdir (cache, i));
++ if (updateDirs && FcCacheNumSubdir (cache) > 0)
++ FcStrSetAdd (updateDirs, dir);
+
+- FcDirCacheUnload (cache);
++ FcDirCacheUnload (cache);
+
+- sublist = FcStrListCreate (subdirs);
+- FcStrSetDestroy (subdirs);
+- if (!sublist)
+- {
+- fprintf (stderr, "%s: Can't create subdir list\n", dir);
+- ret++;
+- continue;
++ sublist = FcStrListCreate (subdirs);
++ FcStrSetDestroy (subdirs);
++ if (!sublist)
++ {
++ fprintf (stderr, "%s: Can't create subdir list\n", dir);
++ ret++;
++ continue;
++ }
++ FcStrSetAdd (processed_dirs, dir);
++ ret += scanDirs (sublist, config, force, really_force, verbose, recursive, changed, updateDirs);
++ FcStrListDone (sublist);
+ }
+- FcStrSetAdd (processed_dirs, dir);
+- ret += scanDirs (sublist, config, force, really_force, verbose, changed);
++ else
++ FcDirCacheUnload (cache);
+ }
+- FcStrListDone (list);
+ return ret;
+ }
+
+@@ -266,7 +281,7 @@ cleanCacheDirectories (FcConfig *config,
+ int
+ main (int argc, char **argv)
+ {
+- FcStrSet *dirs;
++ FcStrSet *dirs, *updateDirs;
+ FcStrList *list;
+ FcBool verbose = FcFalse;
+ FcBool force = FcFalse;
+@@ -364,9 +379,19 @@ main (int argc, char **argv)
+ fprintf(stderr, "Cannot malloc\n");
+ return 1;
+ }
+-
++
++ updateDirs = FcStrSetCreate ();
+ changed = 0;
+- ret = scanDirs (list, config, force, really_force, verbose, &changed);
++ ret = scanDirs (list, config, force, really_force, verbose, FcTrue, &changed, updateDirs);
++ /* Update the directory cache again to avoid the race condition as much as possible */
++ FcStrListDone (list);
++ list = FcStrListCreate (updateDirs);
++ if (list)
++ {
++ ret += scanDirs (list, config, FcTrue, really_force, verbose, FcFalse, &changed, NULL);
++ FcStrListDone (list);
++ }
++ FcStrSetDestroy (updateDirs);
+
+ /*
+ * Try to create CACHEDIR.TAG anyway.
+@@ -379,6 +404,8 @@ main (int argc, char **argv)
+
+ cleanCacheDirectories (config, verbose);
+
++ FcConfigDestroy (config);
++ FcFini ();
+ /*
+ * Now we need to sleep a second (or two, to be extra sure), to make
+ * sure that timestamps for changes after this run of fc-cache are later
+@@ -386,8 +413,7 @@ main (int argc, char **argv)
+ * sleep(3) can't be interrupted by a signal here -- this isn't in the
+ * library, and there aren't any signals flying around here.
+ */
+- FcConfigDestroy (config);
+- FcFini ();
++ /* the resolution of mtime on FAT is 2 seconds */
+ if (changed)
+ sleep (2);
+ if (verbose)
+diff -pruN fontconfig-2.10.93.orig/fontconfig/fontconfig.h fontconfig-2.10.93/fontconfig/fontconfig.h
+--- fontconfig-2.10.93.orig/fontconfig/fontconfig.h 2013-05-20 17:42:34.000000000 +0900
++++ fontconfig-2.10.93/fontconfig/fontconfig.h 2014-07-08 18:27:56.000000000 +0900
+@@ -540,6 +540,9 @@ FcDirSave (FcFontSet *set, FcStrSet *dir
+
+ FcPublic FcCache *
+ FcDirCacheLoad (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file);
++
++FcPublic FcCache *
++FcDirCacheRescan (const FcChar8 *dir, FcConfig *config);
+
+ FcPublic FcCache *
+ FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config);
+@@ -973,6 +976,9 @@ FcStrSetDestroy (FcStrSet *set);
+ FcPublic FcStrList *
+ FcStrListCreate (FcStrSet *set);
+
++FcPublic void
++FcStrListFirst (FcStrList *list);
++
+ FcPublic FcChar8 *
+ FcStrListNext (FcStrList *list);
+
+diff -pruN fontconfig-2.10.93.orig/src/fccache.c fontconfig-2.10.93/src/fccache.c
+--- fontconfig-2.10.93.orig/src/fccache.c 2013-04-04 12:09:46.000000000 +0900
++++ fontconfig-2.10.93/src/fccache.c 2014-07-08 18:27:56.000000000 +0900
+@@ -547,6 +547,26 @@ FcCacheTimeValid (FcCache *cache, struct
+ return cache->checksum == (int) dir_stat->st_mtime;
+ }
+
++static FcBool
++FcCacheDirsValid (FcCache *cache)
++{
++ FcStrSet *dirs = FcStrSetCreate ();
++ FcBool ret = FcFalse;
++
++ if (!dirs)
++ goto bail;
++ if (!FcDirScanOnly (dirs, FcCacheDir (cache)))
++ goto bail1;
++ ret = cache->dirs_count == dirs->num;
++ if (FcDebug () & FC_DBG_CACHE)
++ printf ("%s: cache: %d, fs: %d\n", FcCacheDir (cache), cache->dirs_count, dirs->num);
++
++bail1:
++ FcStrSetDestroy (dirs);
++bail:
++ return ret;
++}
++
+ /*
+ * Map a cache file into memory
+ */
+@@ -561,7 +581,8 @@ FcDirCacheMapFd (int fd, struct stat *fd
+ cache = FcCacheFindByStat (fd_stat);
+ if (cache)
+ {
+- if (FcCacheTimeValid (cache, dir_stat))
++ if (FcCacheTimeValid (cache, dir_stat) &&
++ FcCacheDirsValid (cache))
+ return cache;
+ FcDirCacheUnload (cache);
+ cache = NULL;
+@@ -613,6 +634,7 @@ FcDirCacheMapFd (int fd, struct stat *fd
+ cache->version < FC_CACHE_CONTENT_VERSION ||
+ cache->size != (intptr_t) fd_stat->st_size ||
+ !FcCacheTimeValid (cache, dir_stat) ||
++ !FcCacheDirsValid (cache) ||
+ !FcCacheInsert (cache, fd_stat))
+ {
+ if (allocated)
+@@ -858,6 +880,19 @@ FcMakeDirectory (const FcChar8 *dir)
+ return ret;
+ }
+
++FcCache *
++FcDirCacheRebuild (FcCache *cache, struct stat *dir_stat, FcStrSet *dirs)
++{
++ FcCache *new;
++ FcFontSet *set = FcFontSetDeserialize (FcCacheSet (cache));
++ const FcChar8 *dir = FcCacheDir (cache);
++
++ new = FcDirCacheBuild (set, dir, dir_stat, dirs);
++ FcFontSetDestroy (set);
++
++ return new;
++}
++
+ /* write serialized state to the cache file */
+ FcBool
+ FcDirCacheWrite (FcCache *cache, FcConfig *config)
+diff -pruN fontconfig-2.10.93.orig/src/fcdir.c fontconfig-2.10.93/src/fcdir.c
+--- fontconfig-2.10.93.orig/src/fcdir.c 2013-01-04 10:47:59.000000000 +0900
++++ fontconfig-2.10.93/src/fcdir.c 2014-07-08 18:27:56.000000000 +0900
+@@ -120,7 +120,12 @@ FcFileScanConfig (FcFontSet *set,
+ if (FcFileIsDir (file))
+ return FcStrSetAdd (dirs, file);
+ else
+- return FcFileScanFontConfig (set, blanks, file, config);
++ {
++ if (set)
++ return FcFileScanFontConfig (set, blanks, file, config);
++ else
++ return FcTrue;
++ }
+ }
+
+ FcBool
+@@ -149,7 +154,8 @@ FcDirScanConfig (FcFontSet *set,
+ FcBlanks *blanks,
+ const FcChar8 *dir,
+ FcBool force, /* XXX unused */
+- FcConfig *config)
++ FcConfig *config,
++ FcBool scanOnly)
+ {
+ DIR *d;
+ struct dirent *e;
+@@ -165,7 +171,7 @@ FcDirScanConfig (FcFontSet *set,
+ if (!set && !dirs)
+ return FcTrue;
+
+- if (!blanks)
++ if (!blanks && !scanOnly)
+ blanks = FcConfigGetBlanks (config);
+
+ /* freed below */
+@@ -218,7 +224,17 @@ FcDirScanConfig (FcFontSet *set,
+ * Scan file files to build font patterns
+ */
+ for (i = 0; i < files->num; i++)
+- FcFileScanConfig (set, dirs, blanks, files->strs[i], config);
++ {
++ if (scanOnly)
++ {
++ if (FcFileIsDir (files->strs[i]))
++ FcStrSetAdd (dirs, files->strs[i]);
++ }
++ else
++ {
++ FcFileScanConfig (set, dirs, blanks, files->strs[i], config);
++ }
++ }
+
+ bail2:
+ FcStrSetDestroy (files);
+@@ -242,7 +258,14 @@ FcDirScan (FcFontSet *set,
+ if (cache || !force)
+ return FcFalse;
+
+- return FcDirScanConfig (set, dirs, blanks, dir, force, FcConfigGetCurrent ());
++ return FcDirScanConfig (set, dirs, blanks, dir, force, FcConfigGetCurrent (), FcFalse);
++}
++
++FcBool
++FcDirScanOnly (FcStrSet *dirs,
++ const FcChar8 *dir)
++{
++ return FcDirScanConfig (NULL, dirs, NULL, dir, FcTrue, NULL, FcTrue);
+ }
+
+ /*
+@@ -273,7 +296,7 @@ FcDirCacheScan (const FcChar8 *dir, FcCo
+ /*
+ * Scan the dir
+ */
+- if (!FcDirScanConfig (set, dirs, NULL, dir, FcTrue, config))
++ if (!FcDirScanConfig (set, dirs, NULL, dir, FcTrue, config, FcFalse))
+ goto bail2;
+
+ /*
+@@ -296,6 +319,45 @@ FcDirCacheScan (const FcChar8 *dir, FcCo
+ return cache;
+ }
+
++FcCache *
++FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
++{
++ FcCache *cache = FcDirCacheLoad (dir, config, NULL);
++ FcCache *new = NULL;
++ struct stat dir_stat;
++ FcStrSet *dirs;
++
++ if (!cache)
++ return NULL;
++ if (FcStatChecksum (dir, &dir_stat) < 0)
++ goto bail;
++ dirs = FcStrSetCreate ();
++ if (!dirs)
++ goto bail;
++
++ /*
++ * Scan the dir
++ */
++ if (!FcDirScanConfig (NULL, dirs, NULL, dir, FcTrue, config, FcFalse))
++ goto bail1;
++ /*
++ * Rebuild the cache object
++ */
++ new = FcDirCacheRebuild (cache, &dir_stat, dirs);
++ if (!new)
++ goto bail1;
++ FcDirCacheUnload (cache);
++ /*
++ * Write out the cache file, ignoring any troubles
++ */
++ FcDirCacheWrite (new, config);
++
++bail1:
++ FcStrSetDestroy (dirs);
++bail:
++ return new;
++}
++
+ /*
+ * Read (or construct) the cache for a directory
+ */
+diff -pruN fontconfig-2.10.93.orig/src/fcfs.c fontconfig-2.10.93/src/fcfs.c
+--- fontconfig-2.10.93.orig/src/fcfs.c 2013-01-04 10:47:59.000000000 +0900
++++ fontconfig-2.10.93/src/fcfs.c 2014-07-08 18:27:56.000000000 +0900
+@@ -122,6 +122,28 @@ FcFontSetSerialize (FcSerialize *seriali
+
+ return s_serialize;
+ }
++
++FcFontSet *
++FcFontSetDeserialize (const FcFontSet *set)
++{
++ int i;
++ FcFontSet *new = FcFontSetCreate ();
++
++ if (!new)
++ return NULL;
++ for (i = 0; i < set->nfont; i++)
++ {
++ if (!FcFontSetAdd (new, FcPatternDuplicate (FcFontSetFont (set, i))))
++ goto bail;
++ }
++
++ return new;
++bail:
++ FcFontSetDestroy (new);
++
++ return NULL;
++}
++
+ #define __fcfs__
+ #include "fcaliastail.h"
+ #undef __fcfs__
+diff -pruN fontconfig-2.10.93.orig/src/fcint.h fontconfig-2.10.93/src/fcint.h
+--- fontconfig-2.10.93.orig/src/fcint.h 2013-05-08 11:39:58.000000000 +0900
++++ fontconfig-2.10.93/src/fcint.h 2014-07-08 18:27:56.000000000 +0900
+@@ -548,6 +548,9 @@ FcDirCacheScan (const FcChar8 *dir, FcCo
+ FcPrivate FcCache *
+ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcStrSet *dirs);
+
++FcPrivate FcCache *
++FcDirCacheRebuild (FcCache *cache, struct stat *dir_stat, FcStrSet *dirs);
++
+ FcPrivate FcBool
+ FcDirCacheWrite (FcCache *cache, FcConfig *config);
+
+@@ -800,7 +803,12 @@ FcDirScanConfig (FcFontSet *set,
+ FcBlanks *blanks,
+ const FcChar8 *dir,
+ FcBool force,
+- FcConfig *config);
++ FcConfig *config,
++ FcBool scanOnly);
++
++FcPrivate FcBool
++FcDirScanOnly (FcStrSet *dirs,
++ const FcChar8 *dir);
+
+ /* fcfont.c */
+ FcPrivate int
+@@ -814,6 +822,9 @@ FcFontSetSerializeAlloc (FcSerialize *se
+ FcPrivate FcFontSet *
+ FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s);
+
++FcPrivate FcFontSet *
++FcFontSetDeserialize (const FcFontSet *set);
++
+ /* fchash.c */
+ FcPrivate FcChar8 *
+ FcHashGetSHA256Digest (const FcChar8 *input_strings,
+diff -pruN fontconfig-2.10.93.orig/src/fcpat.c fontconfig-2.10.93/src/fcpat.c
+--- fontconfig-2.10.93.orig/src/fcpat.c 2013-04-04 12:09:46.000000000 +0900
++++ fontconfig-2.10.93/src/fcpat.c 2014-07-08 18:27:56.000000000 +0900
+@@ -33,6 +33,7 @@ FcPatternCreate (void)
+ p = (FcPattern *) malloc (sizeof (FcPattern));
+ if (!p)
+ return 0;
++ memset (p, 0, sizeof (FcPattern));
+ p->num = 0;
+ p->size = 0;
+ p->elts_offset = FcPtrToOffset (p, NULL);
+@@ -1307,6 +1308,7 @@ FcValueListSerialize (FcSerialize *seria
+ }
+ return head_serialized;
+ }
++
+ #define __fcpat__
+ #include "fcaliastail.h"
+ #include "fcftaliastail.h"
+diff -pruN fontconfig-2.10.93.orig/src/fcstr.c fontconfig-2.10.93/src/fcstr.c
+--- fontconfig-2.10.93.orig/src/fcstr.c 2013-05-08 11:53:08.000000000 +0900
++++ fontconfig-2.10.93/src/fcstr.c 2014-07-08 18:27:27.000000000 +0900
+@@ -1374,6 +1374,12 @@ FcStrListCreate (FcStrSet *set)
+ return list;
+ }
+
++void
++FcStrListFirst (FcStrList *list)
++{
++ list->n = 0;
++}
++
+ FcChar8 *
+ FcStrListNext (FcStrList *list)
+ {
diff --git a/fontconfig.spec b/fontconfig.spec
index 5116b96..7e4c910 100644
--- a/fontconfig.spec
+++ b/fontconfig.spec
@@ -3,7 +3,7 @@
Summary: Font configuration and customization library
Name: fontconfig
Version: 2.10.93
-Release: 1%{?dist}
+Release: 2%{?dist}
# src/ftglue.[ch] is in Public Domain
# src/fccache.c contains Public Domain code
# fc-case/CaseFolding.txt is in the UCD
@@ -16,6 +16,7 @@ Source1: 25-no-bitmap-fedora.conf
# https://bugzilla.redhat.com/show_bug.cgi?id=140335
Patch0: fontconfig-2.8.0-sleep-less.patch
+Patch1:; fontconfig-fix-race-condition.patch
BuildRequires: expat-devel
BuildRequires: freetype-devel >= %{freetype_version}
@@ -57,6 +58,7 @@ which is useful for developing applications that uses fontconfig.
%prep
%setup -q
%patch0 -p1 -b .sleep-less
+%patch1 -p1 -b .race
%build
# We don't want to rebuild the docs, but we want to install the included ones.
@@ -133,6 +135,9 @@ fi
%doc fontconfig-devel.txt fontconfig-devel
%changelog
+* Tue Jul 8 2014 Akira TAGOH <tagoh at redhat.com> - 2.10.93-2
+- Fix the race condition issue on updating caches. (#921706)
+
* Mon May 20 2013 Akira TAGOH <tagoh at redhat.com> - 2.10.93-1
- New upstream release.
More information about the scm-commits
mailing list