[PATCH 3/8] Xephyr: integer overflow in ephyrHostGLXGetStringFromServer()

Alan Coopersmith alan.coopersmith at oracle.com
Sat Jul 6 08:37:06 PDT 2013


On 07/ 6/13 02:01 AM, walter harms wrote:
>> @@ -169,7 +169,8 @@ ephyrHostGLXGetStringFromServer(int a_screen_number,
>>       int default_screen = DefaultScreen(dpy);
>>       xGLXGenericGetStringReq *req = NULL;
>>       xGLXSingleReply reply;
>> -    int length = 0, numbytes = 0, major_opcode = 0, get_string_op = 0;
>> +    unsigned long length = 0, numbytes = 0;
>> +    int major_opcode = 0, get_string_op = 0;
>>
>>       EPHYR_RETURN_VAL_IF_FAIL(dpy && a_string, FALSE);
>>
>> @@ -209,36 +210,46 @@ ephyrHostGLXGetStringFromServer(int a_screen_number,
>>
>>       _XReply(dpy, (xReply *) &reply, 0, False);
>>
>> -    length = reply.length * 4;
>> -    if (!length) {
>> -        numbytes = 0;
>> -    }
>> -    else {
>> +#if UINT32_MAX >= (ULONG_MAX / 4)
>> +    if (reply.length >= (ULONG_MAX / 4))
>> +        goto eat_out;
>> +#endif
>
> I am not sure what is going on here, i am missing the else branch,
> For all systems where UINT == ULONG this will be a noop. Is that intended ?

reply.length is a CARD32 (aka uint32_t).   We need to ensure that when we
multiply it by 4, it will fit into the length variable, which is changed
to a unsigned long.

In the 32-bit machine case, where unsigned longs are the same size as uint32_t,
we make this check for overflow.   We don't need an else branch for the #if,
because if the unsigned long is able to hold values at least as large as 4
times the UINT32_MAX (as it will be on LP64 systems), there is no possibility
of overflow.

-- 
	-Alan Coopersmith-              alan.coopersmith at oracle.com
	 Oracle Solaris Engineering - http://blogs.oracle.com/alanc


More information about the xorg-devel mailing list