inet: a little more resilience against misbehaving drivers
This commit is contained in:
parent
f6f20e1269
commit
220eafe705
1 changed files with 28 additions and 1 deletions
|
@ -596,11 +596,38 @@ PRIVATE void read_int(eth_port, count)
|
||||||
eth_port_t *eth_port;
|
eth_port_t *eth_port;
|
||||||
int count;
|
int count;
|
||||||
{
|
{
|
||||||
acc_t *pack, *cut_pack;
|
acc_t *pack, *pack_ptr, *cut_pack;
|
||||||
|
iovec_s_t *iovec;
|
||||||
|
int i, r;
|
||||||
|
|
||||||
|
/* A buggy driver might try to feed us a reply for a request we never
|
||||||
|
* sent. Don't let this cause a crash further up.
|
||||||
|
*/
|
||||||
|
if (!(eth_port->etp_flags & EPF_READ_IP))
|
||||||
|
{
|
||||||
|
printf("mnx_eth`read_int: read reply with no read going on\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pack= eth_port->etp_rd_pack;
|
pack= eth_port->etp_rd_pack;
|
||||||
eth_port->etp_rd_pack= NULL;
|
eth_port->etp_rd_pack= NULL;
|
||||||
|
|
||||||
|
/* Invalidate the grants first, so that the ethernet driver can no
|
||||||
|
* longer modify the contents of the packet.
|
||||||
|
*/
|
||||||
|
iovec= eth_port->etp_osdep.etp_rd_iovec;
|
||||||
|
for (i=0, pack_ptr= pack; i<RD_IOVEC && pack_ptr;
|
||||||
|
i++, pack_ptr= pack_ptr->acc_next)
|
||||||
|
{
|
||||||
|
r= cpf_setgrant_disable(iovec[i].iov_grant);
|
||||||
|
if (r != 0)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"mnx_eth`read_int: cpf_setgrant_disable failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (count < ETH_MIN_PACK_SIZE)
|
if (count < ETH_MIN_PACK_SIZE)
|
||||||
{
|
{
|
||||||
printf("mnx_eth`read_int: packet size too small (%d)\n",
|
printf("mnx_eth`read_int: packet size too small (%d)\n",
|
||||||
|
|
Loading…
Reference in a new issue