Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f203dd4 authored by Christian Brauner's avatar Christian Brauner Committed by Greg Kroah-Hartman
Browse files

ovl: check type and offset of struct vfsmount in ovl_entry



[ Upstream commit f723edb8a532cd26e1ff0a2b271d73762d48f762 ]

Porting overlayfs to the new amount api I started experiencing random
crashes that couldn't be explained easily. So after much debugging and
reasoning it became clear that struct ovl_entry requires the point to
struct vfsmount to be the first member and of type struct vfsmount.

During the port I added a new member at the beginning of struct
ovl_entry which broke all over the place in the form of random crashes
and cache corruptions. While there's a comment in ovl_free_fs() to the
effect of "Hack! Reuse ofs->layers as a vfsmount array before freeing
it" there's no such comment on struct ovl_entry which makes this easy to
trip over.

Add a comment and two static asserts for both the offset and the type of
pointer in struct ovl_entry.

Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 8abed186
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ struct ovl_sb {
};

struct ovl_layer {
	/* ovl_free_fs() relies on @mnt being the first member! */
	struct vfsmount *mnt;
	/* Trap in ovl inode cache */
	struct inode *trap;
@@ -37,6 +38,14 @@ struct ovl_layer {
	int fsid;
};

/*
 * ovl_free_fs() relies on @mnt being the first member when unmounting
 * the private mounts created for each layer. Let's check both the
 * offset and type.
 */
static_assert(offsetof(struct ovl_layer, mnt) == 0);
static_assert(__same_type(typeof_member(struct ovl_layer, mnt), struct vfsmount *));

struct ovl_path {
	struct ovl_layer *layer;
	struct dentry *dentry;