return 0;
 }
 
+static bool valid_floppy_drive_params(const short autodetect[8])
+{
+       size_t floppy_type_size = ARRAY_SIZE(floppy_type);
+       size_t i = 0;
+
+       for (i = 0; i < 8; ++i) {
+               if (autodetect[i] < 0 ||
+                   autodetect[i] >= floppy_type_size)
+                       return false;
+       }
+
+       return true;
+}
+
 static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
                    unsigned long param)
 {
                SUPBOUND(size, strlen((const char *)outparam) + 1);
                break;
        case FDSETDRVPRM:
+               if (!valid_floppy_drive_params(inparam.dp.autodetect))
+                       return -EINVAL;
                *UDP = inparam.dp;
                break;
        case FDGETDRVPRM:
                return -EPERM;
        if (copy_from_user(&v, arg, sizeof(struct compat_floppy_drive_params)))
                return -EFAULT;
+       if (!valid_floppy_drive_params(v.autodetect))
+               return -EINVAL;
        mutex_lock(&floppy_mutex);
        UDP->cmos = v.cmos;
        UDP->max_dtr = v.max_dtr;