1 From 2351c83a77a478b49cba6beb2ad386835e264744 Mon Sep 17 00:00:00 2001
2 From: Alan Coopersmith <alan.coopersmith@oracle.com>
3 Date: Fri, 6 Mar 2015 22:54:58 -0800
4 Subject: [PATCH] bdfReadCharacters: ensure metrics fit into xCharInfo struct
7 We use 32-bit ints to read from the bdf file, but then try to stick
8 into a 16-bit int in the xCharInfo struct, so make sure they won't
13 v2: Verify that additions won't overflow 32-bit int range either.
14 v3: As Julien correctly observes, the previous check for bh & bw not
15 being < 0 reduces the number of cases we need to check for overflow.
17 Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
18 Reviewed-by: Julien Cristau <jcristau@debian.org>
20 Upstream-Status: backport
22 Signed-off-by: Li Zhou <li.zhou@windriver.com>
24 src/bitmap/bdfread.c | 26 ++++++++++++++++++++++++--
25 1 file changed, 24 insertions(+), 2 deletions(-)
27 diff --git a/src/bitmap/bdfread.c b/src/bitmap/bdfread.c
28 index 1b29b81..a0ace8f 100644
29 --- a/src/bitmap/bdfread.c
30 +++ b/src/bitmap/bdfread.c
31 @@ -62,8 +62,16 @@ from The Open Group.
35 -#elif !defined(INT32_MAX)
36 -#define INT32_MAX 0x7fffffff
39 +# define INT32_MAX 0x7fffffff
42 +# define INT16_MAX 0x7fff
45 +# define INT16_MIN (0 - 0x8000)
50 @@ -417,6 +425,12 @@ bdfReadCharacters(FontFilePtr file, FontPtr pFont, bdfFileState *pState,
51 bdfError("DWIDTH y value must be zero\n");
54 + /* xCharInfo metrics are stored as INT16 */
55 + if ((wx < 0) || (wx > INT16_MAX)) {
56 + bdfError("character '%s' has out of range width, %d\n",
60 line = bdfGetLine(file, lineBuf, BDFLINELEN);
61 if ((!line) || (sscanf((char *) line, "BBX %d %d %d %d", &bw, &bh, &bl, &bb) != 4)) {
62 bdfError("bad 'BBX'\n");
63 @@ -427,6 +441,14 @@ bdfReadCharacters(FontFilePtr file, FontPtr pFont, bdfFileState *pState,
67 + /* xCharInfo metrics are read as int, but stored as INT16 */
68 + if ((bl > INT16_MAX) || (bl < INT16_MIN) ||
69 + (bb > INT16_MAX) || (bb < INT16_MIN) ||
70 + (bw > (INT16_MAX - bl)) || (bh > (INT16_MAX - bb))) {
71 + bdfError("character '%s' has out of range metrics, %d %d %d %d\n",
72 + charName, bl, (bl+bw), (bh+bb), -bb);
75 line = bdfGetLine(file, lineBuf, BDFLINELEN);
76 if ((line) && (bdfIsPrefix(line, "ATTRIBUTES"))) {
77 for (p = line + strlen("ATTRIBUTES ");