--- y/drivers/net/tun.c
+++ t/drivers/net/tun.c
@@ -212,6 +212,7 @@ struct tun_struct {
/* init args */
struct file *file;
struct ifreq *ifr;
+ int all_detached;
};
struct veth {
@@ -701,6 +702,7 @@ static void tun_detach_all(struct net_de
struct tun_file *tfile, *tmp;
int i, n = tun->numqueues;
+ tun->all_detached = 1;
for (i = 0; i < n; i++) {
tfile = rtnl_dereference(tun->tfiles[i]);
BUG_ON(!tfile);
@@ -808,6 +810,10 @@ static int tun_attach(struct tun_struct
if (tfile->detached) {
tun_enable_queue(tfile);
} else {
+ if (tun->all_detached) {
+ err = -EINVAL;
+ goto out;
+ }
sock_hold(&tfile->sk);
tun_napi_init(tun, tfile, napi, napi_frags);
}
@@ -2803,6 +2809,7 @@ static int tun_set_iff(struct net *net,
tun->ifr = ifr;
tun->file = file;
+ tun->all_detached = 0;
tun_net_initialize(dev);