diff options
author | Mike DePaulo <mikedep333@gmail.com> | 2015-02-08 22:08:09 -0500 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2015-02-14 16:14:31 +0100 |
commit | c6aebf9284855a0e24ad9c5ffdd36aa65e16bec7 (patch) | |
tree | 9a5c047718ac543a246622a476e75da5d013e176 /nx-X11/lib/font/fc/fsconvert.c | |
parent | 2d724c1a0416895dd39bf33678f42cbb4c51b1ae (diff) | |
download | nx-libs-c6aebf9284855a0e24ad9c5ffdd36aa65e16bec7.tar.gz nx-libs-c6aebf9284855a0e24ad9c5ffdd36aa65e16bec7.tar.bz2 nx-libs-c6aebf9284855a0e24ad9c5ffdd36aa65e16bec7.zip |
CVE-2014-0210: unvalidated length fields in fs_read_query_info() from xorg/lib/libXfont commit 491291cabf78efdeec8f18b09e14726a9030cc8f
fs_read_query_info() parses a reply from the font server. The reply
contains embedded length fields, none of which are validated. This
can cause out of bound reads in either fs_read_query_info() or in
_fs_convert_props() which it calls to parse the fsPropInfo in the reply.
Diffstat (limited to 'nx-X11/lib/font/fc/fsconvert.c')
-rw-r--r-- | nx-X11/lib/font/fc/fsconvert.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/nx-X11/lib/font/fc/fsconvert.c b/nx-X11/lib/font/fc/fsconvert.c index 9ff54f58f..d41e0b83e 100644 --- a/nx-X11/lib/font/fc/fsconvert.c +++ b/nx-X11/lib/font/fc/fsconvert.c @@ -123,6 +123,10 @@ _fs_convert_props(fsPropInfo *pi, fsPropOffset *po, pointer pd, for (i = 0; i < nprops; i++, dprop++, is_str++) { memcpy(&local_off, off_adr, SIZEOF(fsPropOffset)); + if ((local_off.name.position >= pi->data_len) || + (local_off.name.length > + (pi->data_len - local_off.name.position))) + goto bail; dprop->name = MakeAtom(&pdc[local_off.name.position], local_off.name.length, 1); if (local_off.type != PropTypeString) { @@ -130,15 +134,20 @@ _fs_convert_props(fsPropInfo *pi, fsPropOffset *po, pointer pd, dprop->value = local_off.value.position; } else { *is_str = TRUE; + if ((local_off.value.position >= pi->data_len) || + (local_off.value.length > + (pi->data_len - local_off.value.position))) + goto bail; dprop->value = (INT32) MakeAtom(&pdc[local_off.value.position], local_off.value.length, 1); if (dprop->value == BAD_RESOURCE) { - xfree (pfi->props); - pfi->nprops = 0; - pfi->props = 0; - pfi->isStringProp = 0; - return -1; + bail: + xfree (pfi->props); + pfi->nprops = 0; + pfi->props = 0; + pfi->isStringProp = 0; + return -1; } } off_adr += SIZEOF(fsPropOffset); |