dm ioctl: log an error if the ioctl structure is corrupted
authorMikulas Patocka <mpatocka@redhat.com>
Sun, 20 Mar 2022 21:12:46 +0000 (17:12 -0400)
committerMike Snitzer <snitzer@kernel.org>
Fri, 1 Apr 2022 14:29:43 +0000 (10:29 -0400)
This will help triage bugs when userspace is passing invalid ioctl
structure to the kernel.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
[snitzer: log errors using DMERR instead of DMWARN]
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
drivers/md/dm-ioctl.c

index 901abd6dea41972a2eb9079e9a353268d0c0ee1c..87310fceb0d86302c0324fbd01fb52897a50bec0 100644 (file)
@@ -891,15 +891,21 @@ static struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param)
        struct hash_cell *hc = NULL;
 
        if (*param->uuid) {
-               if (*param->name || param->dev)
+               if (*param->name || param->dev) {
+                       DMERR("Invalid ioctl structure: uuid %s, name %s, dev %llx",
+                             param->uuid, param->name, (unsigned long long)param->dev);
                        return NULL;
+               }
 
                hc = __get_uuid_cell(param->uuid);
                if (!hc)
                        return NULL;
        } else if (*param->name) {
-               if (param->dev)
+               if (param->dev) {
+                       DMERR("Invalid ioctl structure: name %s, dev %llx",
+                             param->name, (unsigned long long)param->dev);
                        return NULL;
+               }
 
                hc = __get_name_cell(param->name);
                if (!hc)
@@ -1851,8 +1857,11 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
        if (copy_from_user(param_kernel, user, minimum_data_size))
                return -EFAULT;
 
-       if (param_kernel->data_size < minimum_data_size)
+       if (param_kernel->data_size < minimum_data_size) {
+               DMERR("Invalid data size in the ioctl structure: %u",
+                     param_kernel->data_size);
                return -EINVAL;
+       }
 
        secure_data = param_kernel->flags & DM_SECURE_DATA_FLAG;