Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fs: limit filesystem stacking depth

Add a simple read-only counter to super_block that indicates how deep this
is in the stack of filesystems. Previously ecryptfs was the only stackable
filesystem and it explicitly disallowed multiple layers of itself.

Overlayfs, however, can be stacked recursively and also may be stacked
on top of ecryptfs or vice versa.

To limit the kernel stack usage we must limit the depth of the
filesystem stack. Initially the limit is set to 2.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>

+27
+7
fs/ecryptfs/main.c
··· 566 566 s->s_maxbytes = path.dentry->d_sb->s_maxbytes; 567 567 s->s_blocksize = path.dentry->d_sb->s_blocksize; 568 568 s->s_magic = ECRYPTFS_SUPER_MAGIC; 569 + s->s_stack_depth = path.dentry->d_sb->s_stack_depth + 1; 570 + 571 + rc = -EINVAL; 572 + if (s->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) { 573 + pr_err("eCryptfs: maximum fs stacking depth exceeded\n"); 574 + goto out_free; 575 + } 569 576 570 577 inode = ecryptfs_get_inode(path.dentry->d_inode, s); 571 578 rc = PTR_ERR(inode);
+9
fs/overlayfs/super.c
··· 677 677 } 678 678 ufs->lower_namelen = statfs.f_namelen; 679 679 680 + sb->s_stack_depth = max(upperpath.mnt->mnt_sb->s_stack_depth, 681 + lowerpath.mnt->mnt_sb->s_stack_depth) + 1; 682 + 683 + err = -EINVAL; 684 + if (sb->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) { 685 + pr_err("overlayfs: maximum fs stacking depth exceeded\n"); 686 + goto out_put_workpath; 687 + } 688 + 680 689 ufs->upper_mnt = clone_private_mount(&upperpath); 681 690 err = PTR_ERR(ufs->upper_mnt); 682 691 if (IS_ERR(ufs->upper_mnt)) {
+11
include/linux/fs.h
··· 261 261 */ 262 262 #include <linux/quota.h> 263 263 264 + /* 265 + * Maximum number of layers of fs stack. Needs to be limited to 266 + * prevent kernel stack overflow 267 + */ 268 + #define FILESYSTEM_MAX_STACK_DEPTH 2 269 + 264 270 /** 265 271 * enum positive_aop_returns - aop return codes with specific semantics 266 272 * ··· 1279 1273 struct list_lru s_dentry_lru ____cacheline_aligned_in_smp; 1280 1274 struct list_lru s_inode_lru ____cacheline_aligned_in_smp; 1281 1275 struct rcu_head rcu; 1276 + 1277 + /* 1278 + * Indicates how deep in a filesystem stack this SB is 1279 + */ 1280 + int s_stack_depth; 1282 1281 }; 1283 1282 1284 1283 extern struct timespec current_fs_time(struct super_block *sb);