]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/blob
b64f1d9a8731e9fdf345b10415a911272f7a36cf
[thirdparty/openembedded/openembedded-core-contrib.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