summaryrefslogtreecommitdiffstats
path: root/sys/fs/devfs/devfs_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/devfs/devfs_vnops.c')
-rw-r--r--sys/fs/devfs/devfs_vnops.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index 5f1063d..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;
@@ -1589,6 +1594,7 @@ devfs_symlink(struct vop_symlink_args *ap)
de_dotdot = TAILQ_NEXT(de_dotdot, de_list); /* ".." */
TAILQ_INSERT_AFTER(&dd->de_dlist, de_dotdot, de, de_list);
devfs_dir_ref_de(dmp, dd);
+ devfs_rules_apply(dmp, de);
return (devfs_allocv(de, ap->a_dvp->v_mount, LK_EXCLUSIVE, ap->a_vpp));
}
OpenPOWER on IntegriCloud