[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