net: pcnet: add check to validate receive data size(CVE-2015-7504)
In loopback mode, pcnet_receive routine appends CRC code to the receive buffer. If the data size given is same as the buffer size, the appended CRC code overwrites 4 bytes after s->buffer. Added a check to avoid that. Reported by: Qinghao Tang <luodalongde@gmail.com> Cc: qemu-stable@nongnu.org Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
		
							parent
							
								
									9596ef7c7b
								
							
						
					
					
						commit
						837f21aacf
					
				| @ -1084,7 +1084,7 @@ ssize_t pcnet_receive(NetClientState *nc, const uint8_t *buf, size_t size_) | ||||
|                 uint32_t fcs = ~0; | ||||
|                 uint8_t *p = src; | ||||
| 
 | ||||
|                 while (p != &src[size-4]) | ||||
|                 while (p != &src[size]) | ||||
|                     CRC(fcs, *p++); | ||||
|                 crc_err = (*(uint32_t *)p != htonl(fcs)); | ||||
|             } | ||||
| @ -1233,8 +1233,10 @@ static void pcnet_transmit(PCNetState *s) | ||||
|         bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT); | ||||
| 
 | ||||
|         /* if multi-tmd packet outsizes s->buffer then skip it silently.
 | ||||
|            Note: this is not what real hw does */ | ||||
|         if (s->xmit_pos + bcnt > sizeof(s->buffer)) { | ||||
|          * Note: this is not what real hw does. | ||||
|          * Last four bytes of s->buffer are used to store CRC FCS code. | ||||
|          */ | ||||
|         if (s->xmit_pos + bcnt > sizeof(s->buffer) - 4) { | ||||
|             s->xmit_pos = -1; | ||||
|             goto txdone; | ||||
|         } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Prasad J Pandit
						Prasad J Pandit