summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ufs
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>1999-02-26 05:34:16 +0000
committerimp <imp@FreeBSD.org>1999-02-26 05:34:16 +0000
commitb4c5cb05603484a51d90037ef2c7bb6d35115c2b (patch)
tree88362d61a3396da108fc00f5c16fe2784708d102 /sys/ufs/ufs
parentf508af76207faff73c41e390b94663e30c6ad40a (diff)
downloadFreeBSD-src-b4c5cb05603484a51d90037ef2c7bb6d35115c2b.zip
FreeBSD-src-b4c5cb05603484a51d90037ef2c7bb6d35115c2b.tar.gz
Fix last commit based on feedback from Guido, Bruce and Terry.
Specifically, the test was in the wrong place, lacked a cast, didn't unlock the node, and exited to bad rather than abortit. Now we don't allow renaming of a file with LINK_MAX references. Move the test to earlier in the code as it is closer to where ip is obtained, as that is the style of the rest of the function. Didn't fix the problems bruce pointed out in the rename man page to include EMLINK, nor address his complaints about how the whole idea of incrementing the link count during a rename is potentially asking for trouble. Also didn't try to correct potential problem Terry pointed out with decrements not being similarly protected against underflow.
Diffstat (limited to 'sys/ufs/ufs')
-rw-r--r--sys/ufs/ufs/ufs_vnops.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 7169e65..98a8ccb 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95
- * $Id: ufs_vnops.c,v 1.108 1999/02/25 05:35:53 dillon Exp $
+ * $Id: ufs_vnops.c,v 1.109 1999/02/25 09:52:46 imp Exp $
*/
#include "opt_quota.h"
@@ -978,6 +978,11 @@ abortit:
goto abortit;
dp = VTOI(fdvp);
ip = VTOI(fvp);
+ if ((nlink_t) ip->i_nlink >= LINK_MAX) {
+ VOP_UNLOCK(fvp, 0, p);
+ error = EMLINK;
+ goto abortit;
+ }
if ((ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND))
|| (dp->i_flags & APPEND)) {
VOP_UNLOCK(fvp, 0, p);
@@ -1017,10 +1022,6 @@ abortit:
* completing our work, the link count
* may be wrong, but correctable.
*/
- if (ip->i_nlink >= LINK_MAX) {
- error = EMLINK;
- goto bad;
- }
ip->i_effnlink++;
ip->i_nlink++;
ip->i_flag |= IN_CHANGE;
OpenPOWER on IntegriCloud