[Fontconfig] patch: crosscheck font caches

Patrick Lam plam at MIT.EDU
Tue Nov 1 02:13:44 EST 2005


I can't reproduce the broken-cache problem on my computer, although I
can verify that the broken caches that other people send me are indeed
broken.  I don't know when this corruption is occuring; note that it
also throws out all the strings and langsets in the cache file.  This
patch adds an assertion that will abort fc-cache when it's trying to
write a corrupted cache file.  If some of the people experiencing
corrupted caches could try this patch and tell me under what
circumstances corruption is happening, that would help a lot, because
I'm somewhat at a loss.

Is there any chance that some other application (not fc-cache) is
modifying the fonts.cache-2 file?  That would be weird and inexplicable.
 Mail me if you have any ideas.

pat

Index: src/fccache.c
===================================================================
RCS file: /cvs/fontconfig/fontconfig/src/fccache.c,v
retrieving revision 1.23.4.28
diff -u -r1.23.4.28 fccache.c
--- src/fccache.c       21 Oct 2005 20:24:30 -0000      1.23.4.28
+++ src/fccache.c       31 Oct 2005 15:08:37 -0000
@@ -808,6 +808,8 @@
     if (!FcFontSetSerialize (bank, set))
        goto bail;

+    FcCharSetCrossCheck(bank);
+
     return current_dir_block;

  bail:
Index: src/fccharset.c
===================================================================
RCS file: /cvs/fontconfig/fontconfig/src/fccharset.c,v
retrieving revision 1.25.4.4
diff -u -r1.25.4.4 fccharset.c
--- src/fccharset.c     22 Sep 2005 23:45:53 -0000      1.25.4.4
+++ src/fccharset.c     31 Oct 2005 15:08:37 -0000
@@ -1425,6 +1425,20 @@
     return block_ptr;
 }

+void
+FcCharSetCrossCheck (int bank)
+{
+    int bi = FcCacheBankToIndex(bank);
+    int i;
+
+    for (i = 0; i < charset_ptr; i++)
+       if (charsets[bi][i].ref != FC_REF_CONSTANT)
+       {
+           printf ("ERROR! BAD CHARSET!  PLEASE INFORM plam at mit.edu!\n");
+           abort();
+       }
+}
+
 FcCharLeaf *
 FcCharSetGetLeaf(const FcCharSet *c, int i)
 {
Index: src/fcint.h
===================================================================
RCS file: /cvs/fontconfig/fontconfig/src/fcint.h,v
retrieving revision 1.47.4.15
diff -u -r1.47.4.15 fcint.h
--- src/fcint.h 22 Oct 2005 14:21:14 -0000      1.47.4.15
+++ src/fcint.h 31 Oct 2005 15:08:37 -0000
@@ -549,6 +549,9 @@
 FcChar16 *
 FcCharSetGetNumbers(const FcCharSet *c);

+void
+FcCharSetCrossCheck (int bank);
+
 /* fcdbg.c */
 void
 FcValueListPrint (const FcValueListPtr l);



More information about the Fontconfig mailing list