aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2021-05-17 00:02:42 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2021-05-31 00:54:42 +0000
commitf9738ecc411548be9a8f67c5d33839c6e886b8b3 (patch)
tree7ce095fb1ecea7b8b9a26f311e30419d10e30889
parent6a1b3e91539d56ff476c12e88ece9a2e9c365463 (diff)
downloadsrc-f9738ecc411548be9a8f67c5d33839c6e886b8b3.tar.gz
src-f9738ecc411548be9a8f67c5d33839c6e886b8b3.zip
Fix handling of embedded symbolic links
Sponsored by: Netflix (cherry picked from commit 9a2fac6ba65fbd14d37ccedbc2aec27a190128ea)
-rw-r--r--sys/kern/vfs_subr.c3
-rw-r--r--sys/sys/mount.h2
-rw-r--r--sys/ufs/ffs/ffs_inode.c4
-rw-r--r--sys/ufs/ufs/ufs_vnops.c4
4 files changed, 5 insertions, 8 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 601f159d0c67..15ea8a1275c9 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -3859,7 +3859,8 @@ DB_SHOW_COMMAND(mount, db_show_mount)
db_printf(" mnt_activevnodelistsize = %d\n",
mp->mnt_activevnodelistsize);
db_printf(" mnt_writeopcount = %d\n", mp->mnt_writeopcount);
- db_printf(" mnt_maxsymlinklen = %d\n", mp->mnt_maxsymlinklen);
+ db_printf(" mnt_maxsymlinklen = %jd\n",
+ (uintmax_t)mp->mnt_maxsymlinklen);
db_printf(" mnt_iosize_max = %d\n", mp->mnt_iosize_max);
db_printf(" mnt_hashseed = %u\n", mp->mnt_hashseed);
db_printf(" mnt_lockref = %d\n", mp->mnt_lockref);
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index f1a42cb3d29b..d3a3b6fa0558 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -209,7 +209,7 @@ struct mount {
uint64_t mnt_flag; /* (i) flags shared with user */
struct vfsoptlist *mnt_opt; /* current mount options */
struct vfsoptlist *mnt_optnew; /* new options passed to fs */
- int mnt_maxsymlinklen; /* max size of short symlink */
+ uint64_t mnt_maxsymlinklen; /* max size of short symlink */
struct statfs mnt_stat; /* cache of filesystem stats */
struct ucred *mnt_cred; /* credentials of mounter */
void * mnt_data; /* private data */
diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c
index 8fbe02cd572b..d0fa00cfaf6e 100644
--- a/sys/ufs/ffs/ffs_inode.c
+++ b/sys/ufs/ffs/ffs_inode.c
@@ -302,9 +302,7 @@ ffs_truncate(vp, length, flags, cred)
}
if ((flags & IO_NORMAL) == 0)
return (0);
- if (vp->v_type == VLNK &&
- (ip->i_size < vp->v_mount->mnt_maxsymlinklen ||
- datablocks == 0)) {
+ if (vp->v_type == VLNK && ip->i_size < vp->v_mount->mnt_maxsymlinklen) {
#ifdef INVARIANTS
if (length != 0)
panic("ffs_truncate: partial truncate of symlink");
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index eee8004bb029..0174e0baebb6 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -2279,10 +2279,8 @@ ufs_readlink(ap)
doff_t isize;
isize = ip->i_size;
- if ((isize < vp->v_mount->mnt_maxsymlinklen) ||
- DIP(ip, i_blocks) == 0) { /* XXX - for old fastlink support */
+ if (isize < vp->v_mount->mnt_maxsymlinklen)
return (uiomove(SHORTLINK(ip), isize, ap->a_uio));
- }
return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred));
}