aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/X11/XrmI.h
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@oracle.com>2013-03-01 18:37:37 -0800
committerUlrich Sibiller <uli42@gmx.de>2016-10-12 09:34:38 +0200
commit00d7a2e5ba30ded2d3d9ecc696bf324586a380b0 (patch)
tree562d391fbf7acdcf563b6abe8cd0acfb503391a5 /nx-X11/lib/X11/XrmI.h
parent0349af1145cb70985bc4cba2d439a7b50d6d95ea (diff)
downloadnx-libs-00d7a2e5ba30ded2d3d9ecc696bf324586a380b0.tar.gz
nx-libs-00d7a2e5ba30ded2d3d9ecc696bf324586a380b0.tar.bz2
nx-libs-00d7a2e5ba30ded2d3d9ecc696bf324586a380b0.zip
integer overflow in ReadInFile() in Xrm.c [CVE-2013-1981 7/13]
Called from XrmGetFileDatabase() which gets called from InitDefaults() which gets the filename from getenv ("XENVIRONMENT") If file is exactly 0xffffffff bytes long (or longer and truncates to 0xffffffff, on implementations where off_t is larger than an int), then size may be set to a value which overflows causing less memory to be allocated than is written to by the following read() call. size is left limited to an int, because if your Xresources file is larger than 2gb, you're very definitely doing it wrong. 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> Signed-off-by: Julien Cristau <jcristau@debian.org> Backported-to-NX-by: Ulrich Sibiller <uli42@gmx.de>
Diffstat (limited to 'nx-X11/lib/X11/XrmI.h')
-rw-r--r--nx-X11/lib/X11/XrmI.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/nx-X11/lib/X11/XrmI.h b/nx-X11/lib/X11/XrmI.h
index a1615f4e5..63ed257ed 100644
--- a/nx-X11/lib/X11/XrmI.h
+++ b/nx-X11/lib/X11/XrmI.h
@@ -35,11 +35,13 @@ from The Open Group.
#include <nx-X11/Xos.h>
#include <sys/stat.h>
+#include <limits.h>
#define GetSizeOfFile(fd,size) \
{ \
struct stat status_buffer; \
- if ( (fstat((fd), &status_buffer)) == -1 ) \
+ if ( ((fstat((fd), &status_buffer)) == -1 ) || \
+ (status_buffer.st_size >= INT_MAX) ) \
size = -1; \
else \
size = status_buffer.st_size; \