]> code.ossystems Code Review - openembedded-core.git/blob
b64f1d9a8731e9fdf345b10415a911272f7a36cf
[openembedded-core.git] /
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
5  [CVE-2015-1804]
6
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
9 overflow that range.
10
11 Found by afl-1.24b.
12
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.
16
17 Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
18 Reviewed-by: Julien Cristau <jcristau@debian.org>
19
20 Upstream-Status: backport
21
22 Signed-off-by: Li Zhou <li.zhou@windriver.com>
23 ---
24  src/bitmap/bdfread.c |   26 ++++++++++++++++++++++++--
25  1 file changed, 24 insertions(+), 2 deletions(-)
26
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.
32  
33  #if HAVE_STDINT_H
34  #include <stdint.h>
35 -#elif !defined(INT32_MAX)
36 -#define INT32_MAX 0x7fffffff
37 +#else
38 +# ifndef INT32_MAX
39 +#  define INT32_MAX 0x7fffffff
40 +# endif
41 +# ifndef INT16_MAX
42 +#  define INT16_MAX 0x7fff
43 +# endif
44 +# ifndef INT16_MIN
45 +#  define INT16_MIN (0 - 0x8000)
46 +# endif
47  #endif
48  
49  #define INDICES 256
50 @@ -417,6 +425,12 @@ bdfReadCharacters(FontFilePtr file, FontPtr pFont, bdfFileState *pState,
51             bdfError("DWIDTH y value must be zero\n");
52             goto BAILOUT;
53         }
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",
57 +                    charName, wx);
58 +           goto BAILOUT;
59 +       }
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,
64                      charName, bw, bh);
65             goto BAILOUT;
66         }
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);
73 +           goto BAILOUT;
74 +       }
75         line = bdfGetLine(file, lineBuf, BDFLINELEN);
76         if ((line) && (bdfIsPrefix(line, "ATTRIBUTES"))) {
77             for (p = line + strlen("ATTRIBUTES ");
78 -- 
79 1.7.9.5
80