diff options
Diffstat (limited to 'pkgs/development/libraries/freetype')
-rw-r--r-- | pkgs/development/libraries/freetype/default.nix | 23 | ||||
-rw-r--r-- | pkgs/development/libraries/freetype/fix-pcf.patch | 132 |
2 files changed, 143 insertions, 12 deletions
diff --git a/pkgs/development/libraries/freetype/default.nix b/pkgs/development/libraries/freetype/default.nix index 5647f311454..dccde33efcf 100644 --- a/pkgs/development/libraries/freetype/default.nix +++ b/pkgs/development/libraries/freetype/default.nix @@ -7,30 +7,29 @@ }: let - version = "2.5.3"; + version = "2.5.4"; fetch_bohoomil = name: sha256: fetchpatch { - url = https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/8a155db28f264520596cc3e76eb44824bdb30f8e/01_freetype2-iu/ + name; + url = https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/e4c99bcf5ac9595e2c64393c0661377685c0ad24/01_freetype2-iu/ + name; inherit sha256; }; in -with { inherit (stdenv.lib) optional optionalString; }; +with { inherit (stdenv.lib) optional optionals optionalString; }; stdenv.mkDerivation rec { name = "freetype-${version}"; src = fetchurl { url = "mirror://sourceforge/freetype/${name}.tar.bz2"; - sha256 = "0pppcn73b5pwd7zdi9yfx16f5i93y18q7q4jmlkwmwrfsllqp160"; + sha256 = "1fxsbk4lp6ymifldzrb86g3x6mz771jmrzphkz92mcrkddk2qkiv"; }; - patches = [ ./enable-validation.patch ] # from Gentoo - ++ [ - (fetch_bohoomil "freetype-2.5.3-pkgconfig.patch" "1dpfdh8kmka3gzv14glz7l79i545zizah6wma937574v5z2iy3nn") - (fetch_bohoomil "fix_segfault_with_harfbuzz.diff" "1nx36inqrw717b86cla2miprdb3hii4vndw95k0jbbhfmax9k6fy") - ] - ++ optional useEncumberedCode - (fetch_bohoomil "infinality-2.5.3.patch" "0mxiybcb4wwbicrjiinh1b95rv543bh05sdqk1v0ipr3fxfrb47q") - ; + patches = [ ./enable-validation.patch ] # from Gentoo, bohoomil has the same patch as well + ++ [ ./fix-pcf.patch ] + ++ optionals useEncumberedCode [ + (fetch_bohoomil "02-ftsmooth-2.5.4.patch" "11w4wb7gwgpijc788mpkxj92d7rfdwrdv7jzrpxwv5w5cgpx9iw9") + (fetch_bohoomil "03-upstream-2014.12.07.patch" "0gq7y63mg3gc5z69nfkv2kl7xad0bjzsvnl6j1j9q79jjbvaqdq0") + (fetch_bohoomil "04-infinality-2.5.4-2014.12.07.patch" "1gph7z9s2221gy5dxn01v3lga0m9yib8yqsaqj5km74bqx1vlalh") + ]; outputs = [ "dev" "out" ]; diff --git a/pkgs/development/libraries/freetype/fix-pcf.patch b/pkgs/development/libraries/freetype/fix-pcf.patch new file mode 100644 index 00000000000..bb301bcd9ca --- /dev/null +++ b/pkgs/development/libraries/freetype/fix-pcf.patch @@ -0,0 +1,132 @@ +Upstream fixes for pcf fonts. + +http://git.savannah.gnu.org/cgit/freetype/freetype2.git/commit/?id=74af85c4b62b35e55b0ce9dec55ee10cbc4962a2 +http://git.savannah.gnu.org/cgit/freetype/freetype2.git/commit/?id=06842c7b49c21f13c0ab61201daab6ff5a358fcc + +diff --git a/src/pcf/pcfread.c b/src/pcf/pcfread.c +index 998cbed..e3caf82 100644 +--- a/src/pcf/pcfread.c ++++ b/src/pcf/pcfread.c +@@ -2,7 +2,7 @@ + + FreeType font driver for pcf fonts + +- Copyright 2000-2010, 2012, 2013 by ++ Copyright 2000-2010, 2012-2014 by + Francesco Zappa Nardelli + + Permission is hereby granted, free of charge, to any person obtaining a copy +@@ -78,7 +78,7 @@ THE SOFTWARE. + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE( type ), + FT_FRAME_ULONG_LE( format ), +- FT_FRAME_ULONG_LE( size ), ++ FT_FRAME_ULONG_LE( size ), /* rounded up to a multiple of 4 */ + FT_FRAME_ULONG_LE( offset ), + FT_FRAME_END + }; +@@ -95,9 +95,11 @@ THE SOFTWARE. + FT_Memory memory = FT_FACE( face )->memory; + FT_UInt n; + ++ FT_ULong size; + +- if ( FT_STREAM_SEEK ( 0 ) || +- FT_STREAM_READ_FIELDS ( pcf_toc_header, toc ) ) ++ ++ if ( FT_STREAM_SEEK( 0 ) || ++ FT_STREAM_READ_FIELDS( pcf_toc_header, toc ) ) + return FT_THROW( Cannot_Open_Resource ); + + if ( toc->version != PCF_FILE_VERSION || +@@ -154,14 +156,35 @@ THE SOFTWARE. + break; + } + +- /* we now check whether the `size' and `offset' values are reasonable: */ +- /* `offset' + `size' must not exceed the stream size */ ++ /* ++ * We now check whether the `size' and `offset' values are reasonable: ++ * `offset' + `size' must not exceed the stream size. ++ * ++ * Note, however, that X11's `pcfWriteFont' routine (used by the ++ * `bdftopcf' program to create PDF font files) has two special ++ * features. ++ * ++ * - It always assigns the accelerator table a size of 100 bytes in the ++ * TOC, regardless of its real size, which can vary between 34 and 72 ++ * bytes. ++ * ++ * - Due to the way the routine is designed, it ships out the last font ++ * table with its real size, ignoring the TOC's size value. Since ++ * the TOC size values are always rounded up to a multiple of 4, the ++ * difference can be up to three bytes for all tables except the ++ * accelerator table, for which the difference can be as large as 66 ++ * bytes. ++ * ++ */ ++ + tables = face->toc.tables; +- for ( n = 0; n < toc->count; n++ ) ++ size = stream->size; ++ ++ for ( n = 0; n < toc->count - 1; n++ ) + { + /* we need two checks to avoid overflow */ +- if ( ( tables->size > stream->size ) || +- ( tables->offset > stream->size - tables->size ) ) ++ if ( ( tables->size > size ) || ++ ( tables->offset > size - tables->size ) ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; +@@ -169,6 +192,15 @@ THE SOFTWARE. + tables++; + } + ++ /* no check of `tables->size' for last table element ... */ ++ if ( ( tables->offset > size ) ) ++ { ++ error = FT_THROW( Invalid_Table ); ++ goto Exit; ++ } ++ /* ... instead, we adjust `tables->size' to the real value */ ++ tables->size = size - tables->offset; ++ + #ifdef FT_DEBUG_LEVEL_TRACE + + { +@@ -733,8 +765,8 @@ THE SOFTWARE. + + FT_TRACE4(( " number of bitmaps: %d\n", nbitmaps )); + +- /* XXX: PCF_Face->nmetrics is singed FT_Long, see pcf.h */ +- if ( face->nmetrics < 0 || nbitmaps != ( FT_ULong )face->nmetrics ) ++ /* XXX: PCF_Face->nmetrics is signed FT_Long, see pcf.h */ ++ if ( face->nmetrics < 0 || nbitmaps != (FT_ULong)face->nmetrics ) + return FT_THROW( Invalid_File_Format ); + + if ( FT_NEW_ARRAY( offsets, nbitmaps ) ) +diff --git a/src/pcf/pcfread.c b/src/pcf/pcfread.c +index e3caf82..a29a9e3 100644 +--- a/src/pcf/pcfread.c ++++ b/src/pcf/pcfread.c +@@ -192,14 +192,15 @@ THE SOFTWARE. + tables++; + } + +- /* no check of `tables->size' for last table element ... */ ++ /* only check `tables->offset' for last table element ... */ + if ( ( tables->offset > size ) ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } +- /* ... instead, we adjust `tables->size' to the real value */ +- tables->size = size - tables->offset; ++ /* ... and adjust `tables->size' to the real value if necessary */ ++ if ( tables->size > size - tables->offset ) ++ tables->size = size - tables->offset; + + #ifdef FT_DEBUG_LEVEL_TRACE + |