diff options
author | jh <jh@FreeBSD.org> | 2010-12-15 16:49:47 +0000 |
---|---|---|
committer | jh <jh@FreeBSD.org> | 2010-12-15 16:49:47 +0000 |
commit | dd13f4b76e479537afaa94281fc40d59d7e6e342 (patch) | |
tree | dbeab08795b8ccb7f6fb890cd6b762eeccf5f424 /sys/fs/devfs | |
parent | 309885e54efae18606115421f1817260429a5f4b (diff) | |
download | FreeBSD-src-dd13f4b76e479537afaa94281fc40d59d7e6e342.zip FreeBSD-src-dd13f4b76e479537afaa94281fc40d59d7e6e342.tar.gz |
Don't allow user created symbolic links to cover another entries marked
with DE_USER. If a devfs rule hid such entry, it was possible to create
infinite number of symbolic links with the same name.
Reviewed by: kib
Diffstat (limited to 'sys/fs/devfs')
-rw-r--r-- | sys/fs/devfs/devfs_vnops.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index c5f0dca..bf6dab8 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -1580,6 +1580,11 @@ devfs_symlink(struct vop_symlink_args *ap) de_covered = devfs_find(dd, de->de_dirent->d_name, de->de_dirent->d_namlen, 0); if (de_covered != NULL) { + if ((de_covered->de_flags & DE_USER) != 0) { + devfs_delete(dmp, de, DEVFS_DEL_NORECURSE); + sx_xunlock(&dmp->dm_lock); + return (EEXIST); + } KASSERT((de_covered->de_flags & DE_COVERED) == 0, ("devfs_symlink: entry %p already covered", de_covered)); de_covered->de_flags |= DE_COVERED; |