+-- On Thu, 14 Jan 2016, Michael S. Tsirkin wrote --+ | gem_receive copies a packet received from network into an rxbuf[2048] | array on stack, with size limited by descriptor length set by guest. If | guest is malicious and specifies a descriptor length that is too large, | and should packet size exceed array size, this results in a buffer | overflow. | | diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c | index 3639fc1..15a0786 100644 | --- a/hw/net/cadence_gem.c | +++ b/hw/net/cadence_gem.c | @@ -862,6 +862,14 @@ static void gem_transmit(CadenceGEMState *s) | break; | } | | + if (tx_desc_get_length(desc) > sizeof(tx_packet) - (p - tx_packet)) { | + DB_PRINT("TX descriptor @ 0x%x too large: size 0x%x space 0x%x\n", | + (unsigned)packet_desc_addr, | + (unsigned)tx_desc_get_length(desc), | + sizeof(tx_packet) - (p - tx_packet)); | + break; | + } | +
Commit message says gem_receive, but the patch fixes gem_transmit() routine. -- - P J P 47AF CE69 3A90 54AA 9045 1053 DD13 3D32 FE5B 041F