提交 b1d80d12 编写于 作者: J Jason Wang

pcnet: fix possible buffer overflow

In pcnet_receive(), we try to assign size_ to size which converts from
size_t to integer. This will cause troubles when size_ is greater
INT_MAX, this will lead a negative value in size and it can then pass
the check of size < MIN_BUF_SIZE which may lead out of bound access
for both buf and buf1.

Fixing by converting the type of size to size_t.

CC: qemu-stable@nongnu.org
Reported-by: NDaniel Shapira <daniel@twistlock.com>
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: NJason Wang <jasowang@redhat.com>
上级 1a326646
...@@ -988,14 +988,14 @@ ssize_t pcnet_receive(NetClientState *nc, const uint8_t *buf, size_t size_) ...@@ -988,14 +988,14 @@ ssize_t pcnet_receive(NetClientState *nc, const uint8_t *buf, size_t size_)
uint8_t buf1[60]; uint8_t buf1[60];
int remaining; int remaining;
int crc_err = 0; int crc_err = 0;
int size = size_; size_t size = size_;
if (CSR_DRX(s) || CSR_STOP(s) || CSR_SPND(s) || !size || if (CSR_DRX(s) || CSR_STOP(s) || CSR_SPND(s) || !size ||
(CSR_LOOP(s) && !s->looptest)) { (CSR_LOOP(s) && !s->looptest)) {
return -1; return -1;
} }
#ifdef PCNET_DEBUG #ifdef PCNET_DEBUG
printf("pcnet_receive size=%d\n", size); printf("pcnet_receive size=%zu\n", size);
#endif #endif
/* if too small buffer, then expand it */ /* if too small buffer, then expand it */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册