From acb206859deafd32c5ef1901560dc13be2c0d280 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 8 Jan 2018 00:23:26 +0100 Subject: [PATCH] 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. --- sys/src/9/pc/ether8169.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sys/src/9/pc/ether8169.c b/sys/src/9/pc/ether8169.c index 02f39c5f3..734608ab9 100644 --- a/sys/src/9/pc/ether8169.c +++ b/sys/src/9/pc/ether8169.c @@ -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;