diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2013-03-02 09:28:33 -0800 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2013-05-09 18:59:51 -0700 |
commit | fd7d4956bc7a1c4b5c38661b12777ebee4d685d9 (patch) | |
tree | 2ac73470b8e9ec032671579deae78b9a5f0d18a4 | |
parent | 59ae16a00d18588e98af57d26e442af8ea42b7aa (diff) |
unvalidated index in _XkbReadKeySyms() [CVE-2013-1997 5/15]
If the X server returns keymap indexes outside the range of the number of
keys it told us to allocate, out of bounds memory access could occur.
Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com>
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Reviewed-by: Matthieu Herrb <matthieu.herrb@laas.fr>
-rw-r--r-- | src/xkb/XKBGetMap.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/xkb/XKBGetMap.c b/src/xkb/XKBGetMap.c index 30fb6297..4a428d3a 100644 --- a/src/xkb/XKBGetMap.c +++ b/src/xkb/XKBGetMap.c | |||
@@ -151,9 +151,12 @@ XkbClientMapPtr map; | |||
151 | map= xkb->map; | 151 | map= xkb->map; |
152 | if (map->key_sym_map==NULL) { | 152 | if (map->key_sym_map==NULL) { |
153 | register int offset; | 153 | register int offset; |
154 | int size = xkb->max_key_code + 1; | ||
154 | XkbSymMapPtr oldMap; | 155 | XkbSymMapPtr oldMap; |
155 | xkbSymMapWireDesc *newMap; | 156 | xkbSymMapWireDesc *newMap; |
156 | map->key_sym_map= _XkbTypedCalloc((xkb->max_key_code+1),XkbSymMapRec); | 157 | if (((unsigned short)rep->firstKeySym + rep->nKeySyms) > size) |
158 | return BadLength; | ||
159 | map->key_sym_map= _XkbTypedCalloc(size,XkbSymMapRec); | ||
157 | if (map->key_sym_map==NULL) | 160 | if (map->key_sym_map==NULL) |
158 | return BadAlloc; | 161 | return BadAlloc; |
159 | if (map->syms==NULL) { | 162 | if (map->syms==NULL) { |
@@ -209,6 +212,8 @@ XkbClientMapPtr map; | |||
209 | KeySym * newSyms; | 212 | KeySym * newSyms; |
210 | int tmp; | 213 | int tmp; |
211 | 214 | ||
215 | if (((unsigned short)rep->firstKeySym + rep->nKeySyms) > map->num_syms) | ||
216 | return BadLength; | ||
212 | oldMap = &map->key_sym_map[rep->firstKeySym]; | 217 | oldMap = &map->key_sym_map[rep->firstKeySym]; |
213 | for (i=0;i<(int)rep->nKeySyms;i++,oldMap++) { | 218 | for (i=0;i<(int)rep->nKeySyms;i++,oldMap++) { |
214 | newMap= (xkbSymMapWireDesc *) | 219 | newMap= (xkbSymMapWireDesc *) |