ether8169: deal with kernel memory exhaution

when kernel memory is exhausted, rtl8169replenish() can fail
to plant more receive descriptors and rtl8169receive() would
run over the receive tail and crash on the nil ctlr->rb[x].

rtl8169receive() is called on "Receive Descriptor Unavailable"
and "Packet Underrun" so we will try to replenish descriptors
in the beginning first in case memory was exhausted and memory
is available again and make sure not to run over the tail.
This commit is contained in:
cinap_lenrek 2018-01-08 00:23:26 +01:00
parent 069230cd62
commit acb206859d

View file

@ -919,8 +919,10 @@ rtl8169receive(Ether* edev)
int x;
ctlr = edev->ctlr;
x = ctlr->rdh;
for(;;){
if(ctlr->nrq < ctlr->nrd/2)
rtl8169replenish(ctlr);
for(x = ctlr->rdh; x != ctlr->rdt;){
d = &ctlr->rd[x];
if((control = d->control) & Own)
break;