--- linux-2.6.13/drivers/block/loop.c.orig 2005-08-29 00:41:01.000000000 +0100 +++ linux-2.6.13/drivers/block/loop.c 2005-09-14 14:01:42.844009381 +0100 @@ -1076,13 +1081,21 @@ static int loop_set_status_old(struct loop_device *lo, const struct loop_info __user *arg) { - struct loop_info info; - struct loop_info64 info64; + struct loop_info *info; + struct loop_info64 *info64; + int err; - if (copy_from_user(&info, arg, sizeof (struct loop_info))) - return -EFAULT; - loop_info64_from_old(&info, &info64); - return loop_set_status(lo, &info64); + info=kmalloc(sizeof *info + sizeof *info64, GFP_KERNEL); + if (!info) return -ENOMEM; + info64=(struct loop_info64 *)(info+1); + if (copy_from_user(info, arg, sizeof (struct loop_info))) + err = -EFAULT; + else { + loop_info64_from_old(info, info64); + err = loop_set_status(lo, info64); + } + kfree(info); + return err; } static int