add check for LINK_MAX in ufs_mkdir and ufs_rename
SCCS-vsn: sys/ufs/ffs/ffs_vnops.c 7.52
SCCS-vsn: sys/ufs/ffs/ufs_vnops.c 7.52
SCCS-vsn: sys/ufs/lfs/lfs_vnops.c 7.52
SCCS-vsn: sys/ufs/ufs/ufs_vnops.c 7.52
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)ffs_vnops.c 7.51 (Berkeley) %G%
+ * @(#)ffs_vnops.c 7.52 (Berkeley) %G%
register struct inode *ip = VTOI(vp);
int error;
register struct inode *ip = VTOI(vp);
int error;
+ if ((unsigned short)ip->i_nlink >= LINK_MAX)
+ return (EMLINK);
if (ndp->ni_dvp != vp)
ILOCK(ip);
if (ndp->ni_dvp != vp)
ILOCK(ip);
- if (ip->i_nlink == LINK_MAX - 1) {
- error = EMLINK;
- goto out;
- }
ip->i_nlink++;
ip->i_flag |= ICHG;
error = iupdat(ip, &time, &time, 1);
if (!error)
error = direnter(ip, ndp);
ip->i_nlink++;
ip->i_flag |= ICHG;
error = iupdat(ip, &time, &time, 1);
if (!error)
error = direnter(ip, ndp);
if (ndp->ni_dvp != vp)
IUNLOCK(ip);
if (error) {
if (ndp->ni_dvp != vp)
IUNLOCK(ip);
if (error) {
* parent we don't fool with the link count.
*/
if (doingdirectory && newparent) {
* parent we don't fool with the link count.
*/
if (doingdirectory && newparent) {
+ if ((unsigned short)dp->i_nlink >= LINK_MAX) {
+ error = EMLINK;
+ goto bad;
+ }
dp->i_nlink++;
dp->i_flag |= ICHG;
dp->i_nlink++;
dp->i_flag |= ICHG;
- error = iupdat(dp, &time, &time, 1);
+ if (error = iupdat(dp, &time, &time, 1))
+ goto bad;
}
if (error = direnter(ip, tndp))
goto out;
}
if (error = direnter(ip, tndp))
goto out;
dvp = ndp->ni_dvp;
dp = VTOI(dvp);
dvp = ndp->ni_dvp;
dp = VTOI(dvp);
+ if ((unsigned short)dp->i_nlink >= LINK_MAX) {
+ iput(dp);
+ return (EMLINK);
+ }
dmode = vap->va_mode&0777;
dmode |= IFDIR;
/*
dmode = vap->va_mode&0777;
dmode |= IFDIR;
/*
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)ufs_vnops.c 7.51 (Berkeley) %G%
+ * @(#)ufs_vnops.c 7.52 (Berkeley) %G%
register struct inode *ip = VTOI(vp);
int error;
register struct inode *ip = VTOI(vp);
int error;
+ if ((unsigned short)ip->i_nlink >= LINK_MAX)
+ return (EMLINK);
if (ndp->ni_dvp != vp)
ILOCK(ip);
if (ndp->ni_dvp != vp)
ILOCK(ip);
- if (ip->i_nlink == LINK_MAX - 1) {
- error = EMLINK;
- goto out;
- }
ip->i_nlink++;
ip->i_flag |= ICHG;
error = iupdat(ip, &time, &time, 1);
if (!error)
error = direnter(ip, ndp);
ip->i_nlink++;
ip->i_flag |= ICHG;
error = iupdat(ip, &time, &time, 1);
if (!error)
error = direnter(ip, ndp);
if (ndp->ni_dvp != vp)
IUNLOCK(ip);
if (error) {
if (ndp->ni_dvp != vp)
IUNLOCK(ip);
if (error) {
* parent we don't fool with the link count.
*/
if (doingdirectory && newparent) {
* parent we don't fool with the link count.
*/
if (doingdirectory && newparent) {
+ if ((unsigned short)dp->i_nlink >= LINK_MAX) {
+ error = EMLINK;
+ goto bad;
+ }
dp->i_nlink++;
dp->i_flag |= ICHG;
dp->i_nlink++;
dp->i_flag |= ICHG;
- error = iupdat(dp, &time, &time, 1);
+ if (error = iupdat(dp, &time, &time, 1))
+ goto bad;
}
if (error = direnter(ip, tndp))
goto out;
}
if (error = direnter(ip, tndp))
goto out;
dvp = ndp->ni_dvp;
dp = VTOI(dvp);
dvp = ndp->ni_dvp;
dp = VTOI(dvp);
+ if ((unsigned short)dp->i_nlink >= LINK_MAX) {
+ iput(dp);
+ return (EMLINK);
+ }
dmode = vap->va_mode&0777;
dmode |= IFDIR;
/*
dmode = vap->va_mode&0777;
dmode |= IFDIR;
/*
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)lfs_vnops.c 7.51 (Berkeley) %G%
+ * @(#)lfs_vnops.c 7.52 (Berkeley) %G%
register struct inode *ip = VTOI(vp);
int error;
register struct inode *ip = VTOI(vp);
int error;
+ if ((unsigned short)ip->i_nlink >= LINK_MAX)
+ return (EMLINK);
if (ndp->ni_dvp != vp)
ILOCK(ip);
if (ndp->ni_dvp != vp)
ILOCK(ip);
- if (ip->i_nlink == LINK_MAX - 1) {
- error = EMLINK;
- goto out;
- }
ip->i_nlink++;
ip->i_flag |= ICHG;
error = iupdat(ip, &time, &time, 1);
if (!error)
error = direnter(ip, ndp);
ip->i_nlink++;
ip->i_flag |= ICHG;
error = iupdat(ip, &time, &time, 1);
if (!error)
error = direnter(ip, ndp);
if (ndp->ni_dvp != vp)
IUNLOCK(ip);
if (error) {
if (ndp->ni_dvp != vp)
IUNLOCK(ip);
if (error) {
* parent we don't fool with the link count.
*/
if (doingdirectory && newparent) {
* parent we don't fool with the link count.
*/
if (doingdirectory && newparent) {
+ if ((unsigned short)dp->i_nlink >= LINK_MAX) {
+ error = EMLINK;
+ goto bad;
+ }
dp->i_nlink++;
dp->i_flag |= ICHG;
dp->i_nlink++;
dp->i_flag |= ICHG;
- error = iupdat(dp, &time, &time, 1);
+ if (error = iupdat(dp, &time, &time, 1))
+ goto bad;
}
if (error = direnter(ip, tndp))
goto out;
}
if (error = direnter(ip, tndp))
goto out;
dvp = ndp->ni_dvp;
dp = VTOI(dvp);
dvp = ndp->ni_dvp;
dp = VTOI(dvp);
+ if ((unsigned short)dp->i_nlink >= LINK_MAX) {
+ iput(dp);
+ return (EMLINK);
+ }
dmode = vap->va_mode&0777;
dmode |= IFDIR;
/*
dmode = vap->va_mode&0777;
dmode |= IFDIR;
/*
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)ufs_vnops.c 7.51 (Berkeley) %G%
+ * @(#)ufs_vnops.c 7.52 (Berkeley) %G%
register struct inode *ip = VTOI(vp);
int error;
register struct inode *ip = VTOI(vp);
int error;
+ if ((unsigned short)ip->i_nlink >= LINK_MAX)
+ return (EMLINK);
if (ndp->ni_dvp != vp)
ILOCK(ip);
if (ndp->ni_dvp != vp)
ILOCK(ip);
- if (ip->i_nlink == LINK_MAX - 1) {
- error = EMLINK;
- goto out;
- }
ip->i_nlink++;
ip->i_flag |= ICHG;
error = iupdat(ip, &time, &time, 1);
if (!error)
error = direnter(ip, ndp);
ip->i_nlink++;
ip->i_flag |= ICHG;
error = iupdat(ip, &time, &time, 1);
if (!error)
error = direnter(ip, ndp);
if (ndp->ni_dvp != vp)
IUNLOCK(ip);
if (error) {
if (ndp->ni_dvp != vp)
IUNLOCK(ip);
if (error) {
* parent we don't fool with the link count.
*/
if (doingdirectory && newparent) {
* parent we don't fool with the link count.
*/
if (doingdirectory && newparent) {
+ if ((unsigned short)dp->i_nlink >= LINK_MAX) {
+ error = EMLINK;
+ goto bad;
+ }
dp->i_nlink++;
dp->i_flag |= ICHG;
dp->i_nlink++;
dp->i_flag |= ICHG;
- error = iupdat(dp, &time, &time, 1);
+ if (error = iupdat(dp, &time, &time, 1))
+ goto bad;
}
if (error = direnter(ip, tndp))
goto out;
}
if (error = direnter(ip, tndp))
goto out;
dvp = ndp->ni_dvp;
dp = VTOI(dvp);
dvp = ndp->ni_dvp;
dp = VTOI(dvp);
+ if ((unsigned short)dp->i_nlink >= LINK_MAX) {
+ iput(dp);
+ return (EMLINK);
+ }
dmode = vap->va_mode&0777;
dmode |= IFDIR;
/*
dmode = vap->va_mode&0777;
dmode |= IFDIR;
/*