diff --git a/SOURCES/fontconfig-offset-in-elts.patch b/SOURCES/fontconfig-offset-in-elts.patch new file mode 100644 index 0000000..48f7c27 --- /dev/null +++ b/SOURCES/fontconfig-offset-in-elts.patch @@ -0,0 +1,35 @@ +diff --git a/src/fccache.c b/src/fccache.c +index 02ec301..6f3c68a 100644 +--- a/src/fccache.c ++++ b/src/fccache.c +@@ -640,6 +640,7 @@ FcCacheOffsetsValid (FcCache *cache) + FcPattern *font = FcFontSetFont (fs, i); + FcPatternElt *e; + FcValueListPtr l; ++ char *last_offset; + + if ((char *) font < base || + (char *) font > end - sizeof (FcFontSet) || +@@ -653,11 +654,17 @@ FcCacheOffsetsValid (FcCache *cache) + if (e->values != 0 && !FcIsEncodedOffset(e->values)) + return FcFalse; + +- for (j = font->num, l = FcPatternEltValues(e); j >= 0 && l; j--, l = FcValueListNext(l)) +- if (l->next != NULL && !FcIsEncodedOffset(l->next)) +- break; +- if (j < 0) +- return FcFalse; ++ for (j = 0; j < font->num; j++) ++ { ++ last_offset = (char *) font + font->elts_offset; ++ for (l = FcPatternEltValues(&e[j]); l; l = FcValueListNext(l)) ++ { ++ if ((char *) l < last_offset || (char *) l > end - sizeof (*l) || ++ (l->next != NULL && !FcIsEncodedOffset(l->next))) ++ return FcFalse; ++ last_offset = (char *) l + 1; ++ } ++ } + } + } + diff --git a/SOURCES/fontconfig-update-45-latin.patch b/SOURCES/fontconfig-update-45-latin.patch new file mode 100644 index 0000000..53b6613 --- /dev/null +++ b/SOURCES/fontconfig-update-45-latin.patch @@ -0,0 +1,293 @@ +diff --git a/conf.d/45-latin.conf b/conf.d/45-latin.conf +index aa62ed4..5228945 100644 +--- a/conf.d/45-latin.conf ++++ b/conf.d/45-latin.conf +@@ -14,23 +14,31 @@ + <default><family>serif</family></default> + </alias> + <alias> ++ <family>Cambria</family> ++ <default><family>serif</family></default> ++ </alias> ++ <alias> ++ <family>Constantia</family> ++ <default><family>serif</family></default> ++ </alias> ++ <alias> + <family>DejaVu Serif</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Liberation Serif</family> ++ <family>Elephant</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Times New Roman</family> ++ <family>Garamond</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Times</family> ++ <family>Georgia</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Nimbus Roman No9 L</family> ++ <family>Liberation Serif</family> + <default><family>serif</family></default> + </alias> + <alias> +@@ -38,42 +46,50 @@ + <default><family>serif</family></default> + </alias> + <alias> +- <family>Thorndale AMT</family> ++ <family>MS Serif</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Thorndale</family> ++ <family>Nimbus Roman No9 L</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Georgia</family> ++ <family>Nimbus Roman</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Garamond</family> ++ <family>Palatino Linotype</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Palatino Linotype</family> ++ <family>Thorndale AMT</family> + <default><family>serif</family></default> + </alias> + <alias> +- <family>Trebuchet MS</family> ++ <family>Thorndale</family> ++ <default><family>serif</family></default> ++ </alias> ++ <alias> ++ <family>Times New Roman</family> ++ <default><family>serif</family></default> ++ </alias> ++ <alias> ++ <family>Times</family> + <default><family>serif</family></default> + </alias> + <!-- + Sans-serif faces + --> + <alias> +- <family>Bitstream Vera Sans</family> ++ <family>Albany AMT</family> + <default><family>sans-serif</family></default> + </alias> + <alias> +- <family>DejaVu Sans</family> ++ <family>Albany</family> + <default><family>sans-serif</family></default> + </alias> + <alias> +- <family>Liberation Sans</family> ++ <family>Arial Unicode MS</family> + <default><family>sans-serif</family></default> + </alias> + <alias> +@@ -81,19 +97,47 @@ + <default><family>sans-serif</family></default> + </alias> + <alias> ++ <family>Bitstream Vera Sans</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>Britannic</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>Calibri</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>Candara</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>Century Gothic</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>Corbel</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>DejaVu Sans</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> + <family>Helvetica</family> + <default><family>sans-serif</family></default> + </alias> + <alias> +- <family>Verdana</family> ++ <family>Haettenschweiler</family> + <default><family>sans-serif</family></default> + </alias> + <alias> +- <family>Albany AMT</family> ++ <family>Liberation Sans</family> + <default><family>sans-serif</family></default> + </alias> + <alias> +- <family>Albany</family> ++ <family>MS Sans Serif</family> + <default><family>sans-serif</family></default> + </alias> + <alias> +@@ -101,88 +145,124 @@ + <default><family>sans-serif</family></default> + </alias> + <alias> ++ <family>Nimbus Sans</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> + <family>Luxi Sans</family> + <default><family>sans-serif</family></default> + </alias> ++ <alias> ++ <family>Tahoma</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>Trebuchet MS</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>Twentieth Century</family> ++ <default><family>sans-serif</family></default> ++ </alias> ++ <alias> ++ <family>Verdana</family> ++ <default><family>sans-serif</family></default> ++ </alias> + <!-- + Monospace faces + --> ++ <alias> ++ <family>Andale Mono</family> ++ <default><family>monospace</family></default> ++ </alias> + <alias> + <family>Bitstream Vera Sans Mono</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>DejaVu Sans Mono</family> ++ <family>Consolas</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>Liberation Mono</family> ++ <family>Courier New</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>Inconsolata</family> ++ <family>Courier</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>Courier New</family> ++ <family>Cumberland AMT</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>Courier</family> ++ <family>Cumberland</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>Andale Mono</family> ++ <family>DejaVu Sans Mono</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>Luxi Mono</family> ++ <family>Fixedsys</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>Cumberland AMT</family> ++ <family>Inconsolata</family> + <default><family>monospace</family></default> + </alias> + <alias> +- <family>Cumberland</family> ++ <family>Liberation Mono</family> ++ <default><family>monospace</family></default> ++ </alias> ++ <alias> ++ <family>Luxi Mono</family> + <default><family>monospace</family></default> + </alias> + <alias> + <family>Nimbus Mono L</family> + <default><family>monospace</family></default> + </alias> ++ <alias> ++ <family>Nimbus Mono</family> ++ <default><family>monospace</family></default> ++ </alias> ++ <alias> ++ <family>Terminal</family> ++ <default><family>monospace</family></default> ++ </alias> + <!-- + Fantasy faces + --> +- <alias> +- <family>Impact</family> ++ <alias> ++ <family>Bauhaus Std</family> + <default><family>fantasy</family></default> + </alias> + <alias> +- <family>Copperplate Gothic Std</family> ++ <family>Cooper Std</family> + <default><family>fantasy</family></default> + </alias> + <alias> +- <family>Cooper Std</family> ++ <family>Copperplate Gothic Std</family> + <default><family>fantasy</family></default> + </alias> + <alias> +- <family>Bauhaus Std</family> ++ <family>Impact</family> + <default><family>fantasy</family></default> + </alias> + <!-- + Cursive faces + --> + <alias> +- <family>ITC Zapf Chancery Std</family> ++ <family>Comic Sans MS</family> + <default><family>cursive</family></default> + </alias> + <alias> +- <family>Zapfino</family> ++ <family>ITC Zapf Chancery Std</family> + <default><family>cursive</family></default> + </alias> + <alias> +- <family>Comic Sans MS</family> ++ <family>Zapfino</family> + <default><family>cursive</family></default> + </alias> + diff --git a/SOURCES/fontconfig-validate-offset-in-cache.patch b/SOURCES/fontconfig-validate-offset-in-cache.patch new file mode 100644 index 0000000..9009ffd --- /dev/null +++ b/SOURCES/fontconfig-validate-offset-in-cache.patch @@ -0,0 +1,112 @@ +diff -pruN fontconfig-2.10.95.orig/src/fccache.c fontconfig-2.10.95/src/fccache.c +--- fontconfig-2.10.95.orig/src/fccache.c 2013-08-26 11:49:32.000000000 +0900 ++++ fontconfig-2.10.95/src/fccache.c 2016-08-05 18:01:48.040872110 +0900 +@@ -30,6 +30,7 @@ + #include <fcntl.h> + #include <dirent.h> + #include <string.h> ++#include <limits.h> + #include <sys/types.h> + #include <assert.h> + #if defined(HAVE_MMAP) || defined(__CYGWIN__) +@@ -547,6 +548,82 @@ FcCacheTimeValid (FcCache *cache, struct + return cache->checksum == (int) dir_stat->st_mtime; + } + ++static FcBool ++FcCacheOffsetsValid (FcCache *cache) ++{ ++ char *base = (char *)cache; ++ char *end = base + cache->size; ++ intptr_t *dirs; ++ FcFontSet *fs; ++ int i, j; ++ ++ if (cache->dir < 0 || cache->dir > cache->size - sizeof (intptr_t) || ++ memchr (base + cache->dir, '\0', cache->size - cache->dir) == NULL) ++ return FcFalse; ++ ++ if (cache->dirs < 0 || cache->dirs >= cache->size || ++ cache->dirs_count < 0 || ++ cache->dirs_count > (cache->size - cache->dirs) / sizeof (intptr_t)) ++ return FcFalse; ++ ++ dirs = FcCacheDirs (cache); ++ if (dirs) ++ { ++ for (i = 0; i < cache->dirs_count; i++) ++ { ++ FcChar8 *dir; ++ ++ if (dirs[i] < 0 || ++ dirs[i] > end - (char *) dirs - sizeof (intptr_t)) ++ return FcFalse; ++ ++ dir = FcOffsetToPtr (dirs, dirs[i], FcChar8); ++ if (memchr (dir, '\0', end - (char *) dir) == NULL) ++ return FcFalse; ++ } ++ } ++ ++ if (cache->set < 0 || cache->set > cache->size - sizeof (FcFontSet)) ++ return FcFalse; ++ ++ fs = FcCacheSet (cache); ++ if (fs) ++ { ++ if (fs->nfont > (end - (char *) fs) / sizeof (FcPattern)) ++ return FcFalse; ++ ++ if (fs->fonts != 0 && !FcIsEncodedOffset(fs->fonts)) ++ return FcFalse; ++ ++ for (i = 0; i < fs->nfont; i++) ++ { ++ FcPattern *font = FcFontSetFont (fs, i); ++ FcPatternElt *e; ++ FcValueListPtr l; ++ ++ if ((char *) font < base || ++ (char *) font > end - sizeof (FcFontSet) || ++ font->elts_offset < 0 || ++ font->elts_offset > end - (char *) font || ++ font->num > (end - (char *) font - font->elts_offset) / sizeof (FcPatternElt)) ++ return FcFalse; ++ ++ ++ e = FcPatternElts(font); ++ if (e->values != 0 && !FcIsEncodedOffset(e->values)) ++ return FcFalse; ++ ++ for (j = font->num, l = FcPatternEltValues(e); j >= 0 && l; j--, l = FcValueListNext(l)) ++ if (l->next != NULL && !FcIsEncodedOffset(l->next)) ++ break; ++ if (j < 0) ++ return FcFalse; ++ } ++ } ++ ++ return FcTrue; ++} ++ + /* + * Map a cache file into memory + */ +@@ -556,7 +633,8 @@ FcDirCacheMapFd (int fd, struct stat *fd + FcCache *cache; + FcBool allocated = FcFalse; + +- if (fd_stat->st_size < (int) sizeof (FcCache)) ++ if (fd_stat->st_size > INTPTR_MAX || ++ fd_stat->st_size < (int) sizeof (FcCache)) + return NULL; + cache = FcCacheFindByStat (fd_stat); + if (cache) +@@ -612,6 +690,7 @@ FcDirCacheMapFd (int fd, struct stat *fd + if (cache->magic != FC_CACHE_MAGIC_MMAP || + cache->version < FC_CACHE_CONTENT_VERSION || + cache->size != (intptr_t) fd_stat->st_size || ++ !FcCacheOffsetsValid (cache) || + !FcCacheTimeValid (cache, dir_stat) || + !FcCacheInsert (cache, fd_stat)) + { diff --git a/SPECS/fontconfig.spec b/SPECS/fontconfig.spec index 878e553..de7aff2 100644 --- a/SPECS/fontconfig.spec +++ b/SPECS/fontconfig.spec @@ -3,7 +3,7 @@ Summary: Font configuration and customization library Name: fontconfig Version: 2.10.95 -Release: 7%{?dist} +Release: 10%{?dist} # src/ftglue.[ch] is in Public Domain # src/fccache.c contains Public Domain code # fc-case/CaseFolding.txt is in the UCD @@ -22,6 +22,9 @@ Patch2: fontconfig-fix-memleak.patch Patch3: fontconfig-copy-all-value.patch Patch4: fontconfig-fix-crash-on-fcfontsort.patch Patch5: fontconfig-fix-race-condition.patch +Patch6: fontconfig-update-45-latin.patch +Patch7: fontconfig-validate-offset-in-cache.patch +Patch8: fontconfig-offset-in-elts.patch BuildRequires: expat-devel BuildRequires: freetype-devel >= %{freetype_version} @@ -68,6 +71,9 @@ which is useful for developing applications that uses fontconfig. %patch3 -p1 -b .copy-all %patch4 -p1 -b .fix-crash %patch5 -p1 -b .fix-race +%patch6 -p1 -b .update-45-latin +%patch7 -p1 -b .validate-offset +%patch8 -p1 -b .offset-elts cp %{SOURCE2} doc/ %build @@ -145,6 +151,15 @@ fi %doc fontconfig-devel.txt fontconfig-devel %changelog +* Fri Sep 23 2016 Akira TAGOH <tagoh@redhat.com> - 2.10.95-10 +- Fix a regression in the previous change. (#1355930) + +* Fri Aug 5 2016 Akira TAGOH <tagoh@redhat.com> - 2.10.95-9 +- CVE-2016-5384: Validate offsets in cache files properly. (#1355930) + +* Fri Jun 10 2016 Akira TAGOH <tagoh@redhat.com> - 2.10.95-8 +- Update 45-latin.conf to add some hints to fall back for Windows fonts (#1073460) + * Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 2.10.95-7 - Mass rebuild 2014-01-24