From d77100ae1f74516994605dcde2b5833319362f34 Mon Sep 17 00:00:00 2001 From: Masaq- Date: Tue, 26 May 2015 00:07:39 +0000 Subject: [PATCH 1/3] fix sheep_net Linux kernel panic on n2n edge0 tap device --- BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c b/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c index ad55fb65..37a06902 100644 --- a/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c +++ b/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c @@ -425,6 +425,11 @@ static ssize_t sheep_net_read(struct file *f, char *buf, size_t count, loff_t *o * Driver write() function */ +static inline void do_nothing(struct sk_buff *skb) +{ + return; +} + static ssize_t sheep_net_write(struct file *f, const char *buf, size_t count, loff_t *off) { struct SheepVars *v = (struct SheepVars *)f->private_data; @@ -498,6 +503,7 @@ static ssize_t sheep_net_write(struct file *f, const char *buf, size_t count, lo /* Outgoing packet (will be on the net) */ demasquerade(v, skb); + skb->destructor = do_nothing; skb->protocol = PROT_MAGIC; /* Magic value (we can recognize the packet in sheep_net_receiver) */ dev_queue_xmit(skb); return count; From 3a36a1e4564c7d609141c1851c15e3f7f460be81 Mon Sep 17 00:00:00 2001 From: Masaq- Date: Tue, 26 May 2015 05:50:36 +0000 Subject: [PATCH 2/3] fix memory leak reported by kmemleak --- BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c b/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c index 37a06902..49c2fc5d 100644 --- a/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c +++ b/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c @@ -462,7 +462,10 @@ static ssize_t sheep_net_write(struct file *f, const char *buf, size_t count, lo } /* Transmit packet */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) + /* XXX: unsure which version needs this */ atomic_add(skb->truesize, &v->skt->wmem_alloc); +#endif skb->sk = v->skt; skb->dev = v->ether; skb->priority = 0; From 9ae8499d64b5a740aa9ec3abc68dec1263c06868 Mon Sep 17 00:00:00 2001 From: Masaq- Date: Thu, 28 May 2015 02:03:03 +0000 Subject: [PATCH 3/3] make sheep_net removable from Linux 2.6.31 onward --- BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c b/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c index 49c2fc5d..32065835 100644 --- a/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c +++ b/BasiliskII/src/Unix/Linux/NetDriver/sheep_net.c @@ -462,8 +462,7 @@ static ssize_t sheep_net_write(struct file *f, const char *buf, size_t count, lo } /* Transmit packet */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) - /* XXX: unsure which version needs this */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) atomic_add(skb->truesize, &v->skt->wmem_alloc); #endif skb->sk = v->skt;