Re: [PATCH v2 resend] vfs: new O_NODE open flag

From: Miklos Szeredi
Date: Mon Nov 16 2009 - 06:51:52 EST


On Sun, 8 Nov 2009, Pavel Machek wrote:
> Does it really close the race completely?
>
> udev sets 660
> open does permission checks
> device disappears
> chmod 000
> new device appears
> udev chmods 600
> open returns new device

Yes, there's still a small hole there.

We could check nlink != 0 after grabbing the device (untested patch).
That is a hack, however, and would break apps which previously relied
on being able to re-open already deleted devices through /proc/*/fd.
But there might not be a better solution... Thoughts?

Thanks,
Miklos


Index: linux-2.6/fs/char_dev.c
===================================================================
--- linux-2.6.orig/fs/char_dev.c 2009-09-24 20:10:58.000000000 +0200
+++ linux-2.6/fs/char_dev.c 2009-11-16 12:48:58.000000000 +0100
@@ -396,6 +396,16 @@ static int chrdev_open(struct inode *ino
if (ret)
return ret;

+ /*
+ * The device might have been removed and then reused while
+ * the open was in progress. Make sure we don't let open
+ * proceed in such a case, since the old device could have had
+ * different permissions.
+ */
+ ret = -ENOENT;
+ if (inode->i_nlink == 0)
+ goto out_cdev_put;
+
ret = -ENXIO;
filp->f_op = fops_get(p->ops);
if (!filp->f_op)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/