render: Fix out of bounds access in SProcRenderCompositeGlyphs()
ZDI-CAN-14192, CVE-2021-4008
This vulnerability was discovered and the fix was suggested by:
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
(cherry picked from commit ebce7e2d80)
			
			
This commit is contained in:
		
							parent
							
								
									7209982d2a
								
							
						
					
					
						commit
						0b67785cd1
					
				|  | @ -2309,6 +2309,9 @@ SProcRenderCompositeGlyphs(ClientPtr client) | ||||||
| 
 | 
 | ||||||
|         i = elt->len; |         i = elt->len; | ||||||
|         if (i == 0xff) { |         if (i == 0xff) { | ||||||
|  |             if (buffer + 4 > end) { | ||||||
|  |                 return BadLength; | ||||||
|  |             } | ||||||
|             swapl((int *) buffer); |             swapl((int *) buffer); | ||||||
|             buffer += 4; |             buffer += 4; | ||||||
|         } |         } | ||||||
|  | @ -2319,12 +2322,18 @@ SProcRenderCompositeGlyphs(ClientPtr client) | ||||||
|                 buffer += i; |                 buffer += i; | ||||||
|                 break; |                 break; | ||||||
|             case 2: |             case 2: | ||||||
|  |                 if (buffer + i * 2 > end) { | ||||||
|  |                     return BadLength; | ||||||
|  |                 } | ||||||
|                 while (i--) { |                 while (i--) { | ||||||
|                     swaps((short *) buffer); |                     swaps((short *) buffer); | ||||||
|                     buffer += 2; |                     buffer += 2; | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case 4: |             case 4: | ||||||
|  |                 if (buffer + i * 4 > end) { | ||||||
|  |                     return BadLength; | ||||||
|  |                 } | ||||||
|                 while (i--) { |                 while (i--) { | ||||||
|                     swapl((int *) buffer); |                     swapl((int *) buffer); | ||||||
|                     buffer += 4; |                     buffer += 4; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue