[psaux, type1] Fix minor AFM issues. * include/internal/t1types.h (AFM_KernPairRec): Make indices unsigned. Update users. (AFM_FontInfoRec): Make element counters unsigned. Update users. * src/psaux/afmparse.h (AFM_ValueRec): Add union member for unsigned int. * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs): Reject negative values for number of kerning elements. * src/type1/t1afm.c, src/tools/test_afm.c: Updated.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
diff --git a/ChangeLog b/ChangeLog
index 723e5c9..40fa27a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
2015-02-18 Werner Lemberg <wl@gnu.org>
+ [psaux, type1] Fix minor AFM issues.
+
+ * include/internal/t1types.h (AFM_KernPairRec): Make indices
+ unsigned.
+ Update users.
+ (AFM_FontInfoRec): Make element counters unsigned.
+ Update users.
+ * src/psaux/afmparse.h (AFM_ValueRec): Add union member for unsigned
+ int.
+
+ * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs):
+ Reject negative values for number of kerning elements.
+
+ * src/type1/t1afm.c, src/tools/test_afm.c: Updated.
+
+2015-02-18 Werner Lemberg <wl@gnu.org>
+
Don't use `FT_PtrDist' for lengths.
Use FT_UInt instead.
diff --git a/include/internal/t1types.h b/include/internal/t1types.h
index 0953fa5..5e5fd77 100644
--- a/include/internal/t1types.h
+++ b/include/internal/t1types.h
@@ -157,10 +157,10 @@ FT_BEGIN_HEADER
typedef struct AFM_KernPairRec_
{
- FT_Int index1;
- FT_Int index2;
- FT_Int x;
- FT_Int y;
+ FT_UInt index1;
+ FT_UInt index2;
+ FT_Int x;
+ FT_Int y;
} AFM_KernPairRec, *AFM_KernPair;
@@ -171,9 +171,9 @@ FT_BEGIN_HEADER
FT_Fixed Ascender;
FT_Fixed Descender;
AFM_TrackKern TrackKerns; /* free if non-NULL */
- FT_Int NumTrackKern;
+ FT_UInt NumTrackKern;
AFM_KernPair KernPairs; /* free if non-NULL */
- FT_Int NumKernPair;
+ FT_UInt NumKernPair;
} AFM_FontInfoRec, *AFM_FontInfo;
diff --git a/src/psaux/afmparse.c b/src/psaux/afmparse.c
index c9bcfcf..5427b4c 100644
--- a/src/psaux/afmparse.c
+++ b/src/psaux/afmparse.c
@@ -590,11 +590,17 @@
char* key;
FT_Offset len;
int n = -1;
+ FT_Int tmp;
- if ( afm_parser_read_int( parser, &fi->NumTrackKern ) )
+ if ( afm_parser_read_int( parser, &tmp ) )
goto Fail;
+ if ( tmp < 0 )
+ goto Fail;
+
+ fi->NumTrackKern = (FT_UInt)tmp;
+
if ( fi->NumTrackKern )
{
FT_Memory memory = parser->memory;
@@ -615,7 +621,7 @@
case AFM_TOKEN_TRACKKERN:
n++;
- if ( n >= fi->NumTrackKern )
+ if ( n >= (int)fi->NumTrackKern )
goto Fail;
tk = fi->TrackKerns + n;
@@ -639,7 +645,7 @@
case AFM_TOKEN_ENDTRACKKERN:
case AFM_TOKEN_ENDKERNDATA:
case AFM_TOKEN_ENDFONTMETRICS:
- fi->NumTrackKern = n + 1;
+ fi->NumTrackKern = (FT_UInt)( n + 1 );
return FT_Err_Ok;
case AFM_TOKEN_UNKNOWN:
@@ -688,11 +694,17 @@
char* key;
FT_Offset len;
int n = -1;
+ FT_Int tmp;
- if ( afm_parser_read_int( parser, &fi->NumKernPair ) )
+ if ( afm_parser_read_int( parser, &tmp ) )
goto Fail;
+ if ( tmp < 0 )
+ goto Fail;
+
+ fi->NumKernPair = (FT_UInt)tmp;
+
if ( fi->NumKernPair )
{
FT_Memory memory = parser->memory;
@@ -720,7 +732,7 @@
n++;
- if ( n >= fi->NumKernPair )
+ if ( n >= (int)fi->NumKernPair )
goto Fail;
kp = fi->KernPairs + n;
@@ -733,8 +745,9 @@
if ( r < 3 )
goto Fail;
- kp->index1 = shared_vals[0].u.i;
- kp->index2 = shared_vals[1].u.i;
+ /* index values can't be negative */
+ kp->index1 = shared_vals[0].u.u;
+ kp->index2 = shared_vals[1].u.u;
if ( token == AFM_TOKEN_KPY )
{
kp->x = 0;
@@ -752,7 +765,7 @@
case AFM_TOKEN_ENDKERNPAIRS:
case AFM_TOKEN_ENDKERNDATA:
case AFM_TOKEN_ENDFONTMETRICS:
- fi->NumKernPair = n + 1;
+ fi->NumKernPair = (FT_UInt)( n + 1 );
ft_qsort( fi->KernPairs, fi->NumKernPair,
sizeof ( AFM_KernPairRec ),
afm_compare_kern_pairs );
diff --git a/src/psaux/afmparse.h b/src/psaux/afmparse.h
index 155eb40..ac1982e 100644
--- a/src/psaux/afmparse.h
+++ b/src/psaux/afmparse.h
@@ -61,6 +61,7 @@ FT_BEGIN_HEADER
char* s;
FT_Fixed f;
FT_Int i;
+ FT_UInt u;
FT_Bool b;
} u;
diff --git a/src/tools/test_afm.c b/src/tools/test_afm.c
index 24cd0c4..8de619b 100644
--- a/src/tools/test_afm.c
+++ b/src/tools/test_afm.c
@@ -9,7 +9,7 @@
void dump_fontinfo( AFM_FontInfo fi )
{
- FT_Int i;
+ FT_UInt i;
printf( "This AFM is for %sCID font.\n\n",
diff --git a/src/type1/t1afm.c b/src/type1/t1afm.c
index 35f67e8..7f32059 100644
--- a/src/type1/t1afm.c
+++ b/src/type1/t1afm.c
@@ -169,8 +169,8 @@
goto Exit;
/* now, read each kern pair */
- kp = fi->KernPairs;
- limit = p + 4 * fi->NumKernPair;
+ kp = fi->KernPairs;
+ limit = p + 4 * fi->NumKernPair;
/* PFM kerning data are stored by encoding rather than glyph index, */
/* so find the PostScript charmap of this font and install it */
@@ -362,7 +362,7 @@
FT_Fixed* kerning )
{
AFM_FontInfo fi = (AFM_FontInfo)( (T1_Face)face )->afm_data;
- FT_Int i;
+ FT_UInt i;
if ( !fi )