Skip to content

Commit c797893

Browse files
Alex ElderAndi Kleen
authored andcommitted
xfs: zero proper structure size for geometry calls
commit af24ee9 upstream. Commit 493f335 added this call to xfs_fs_geometry() in order to avoid passing kernel stack data back to user space: + memset(geo, 0, sizeof(*geo)); Unfortunately, one of the callers of that function passes the address of a smaller data type, cast to fit the type that xfs_fs_geometry() requires. As a result, this can happen: Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: f87aca93 Pid: 262, comm: xfs_fsr Not tainted 2.6.38-rc6-493f3358cb2+ coolya#1 Call Trace: [<c12991ac>] ? panic+0x50/0x150 [<c102ed71>] ? __stack_chk_fail+0x10/0x18 [<f87aca93>] ? xfs_ioc_fsgeometry_v1+0x56/0x5d [xfs] Fix this by fixing that one caller to pass the right type and then copy out the subset it is interested in. Note: This patch is an alternative to one originally proposed by Eric Sandeen. Reported-by: Jeffrey Hundstad <jeffrey.hundstad@mnsu.edu> Signed-off-by: Alex Elder <aelder@sgi.com> Signed-off-by: Andi Kleen <ak@linux.intel.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Tested-by: Jeffrey Hundstad <jeffrey.hundstad@mnsu.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
1 parent 33b1b26 commit c797893

1 file changed

Lines changed: 8 additions & 3 deletions

File tree

fs/xfs/linux-2.6/xfs_ioctl.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -703,14 +703,19 @@ xfs_ioc_fsgeometry_v1(
703703
xfs_mount_t *mp,
704704
void __user *arg)
705705
{
706-
xfs_fsop_geom_v1_t fsgeo;
706+
xfs_fsop_geom_t fsgeo;
707707
int error;
708708

709-
error = xfs_fs_geometry(mp, (xfs_fsop_geom_t *)&fsgeo, 3);
709+
error = xfs_fs_geometry(mp, &fsgeo, 3);
710710
if (error)
711711
return -error;
712712

713-
if (copy_to_user(arg, &fsgeo, sizeof(fsgeo)))
713+
/*
714+
* Caller should have passed an argument of type
715+
* xfs_fsop_geom_v1_t. This is a proper subset of the
716+
* xfs_fsop_geom_t that xfs_fs_geometry() fills in.
717+
*/
718+
if (copy_to_user(arg, &fsgeo, sizeof(xfs_fsop_geom_v1_t)))
714719
return -XFS_ERROR(EFAULT);
715720
return 0;
716721
}

0 commit comments

Comments
 (0)