summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/function/f_mass_storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/function/f_mass_storage.c')
-rw-r--r--drivers/usb/gadget/function/f_mass_storage.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c
index 2eae8fc2e0db..b7b06cb79ff5 100644
--- a/drivers/usb/gadget/function/f_mass_storage.c
+++ b/drivers/usb/gadget/function/f_mass_storage.c
@@ -180,6 +180,7 @@
#include <linux/kthread.h>
#include <linux/sched/signal.h>
#include <linux/limits.h>
+#include <linux/overflow.h>
#include <linux/pagemap.h>
#include <linux/rwsem.h>
#include <linux/slab.h>
@@ -1853,8 +1854,15 @@ static int check_command_size_in_blocks(struct fsg_common *common,
int cmnd_size, enum data_direction data_dir,
unsigned int mask, int needs_medium, const char *name)
{
- if (common->curlun)
- common->data_size_from_cmnd <<= common->curlun->blkbits;
+ if (common->curlun) {
+ if (check_shl_overflow(common->data_size_from_cmnd,
+ common->curlun->blkbits,
+ &common->data_size_from_cmnd)) {
+ common->phase_error = 1;
+ return -EINVAL;
+ }
+ }
+
return check_command(common, cmnd_size, data_dir,
mask, needs_medium, name);
}
@@ -2142,8 +2150,8 @@ static int do_scsi_command(struct fsg_common *common)
* of Posix locks.
*/
case FORMAT_UNIT:
- case RELEASE:
- case RESERVE:
+ case RELEASE_6:
+ case RESERVE_6:
case SEND_DIAGNOSTIC:
default:
@@ -2699,7 +2707,7 @@ static void fsg_lun_release(struct device *dev)
static struct fsg_common *fsg_common_setup(struct fsg_common *common)
{
if (!common) {
- common = kzalloc(sizeof(*common), GFP_KERNEL);
+ common = kzalloc_obj(*common);
if (!common)
return ERR_PTR(-ENOMEM);
common->free_storage_on_release = 1;
@@ -2740,7 +2748,7 @@ int fsg_common_set_num_buffers(struct fsg_common *common, unsigned int n)
struct fsg_buffhd *bh, *buffhds;
int i;
- buffhds = kcalloc(n, sizeof(*buffhds), GFP_KERNEL);
+ buffhds = kzalloc_objs(*buffhds, n);
if (!buffhds)
return -ENOMEM;
@@ -2887,7 +2895,7 @@ int fsg_common_create_lun(struct fsg_common *common, struct fsg_lun_config *cfg,
return -EINVAL;
}
- lun = kzalloc(sizeof(*lun), GFP_KERNEL);
+ lun = kzalloc_obj(*lun);
if (!lun)
return -ENOMEM;
@@ -3153,7 +3161,7 @@ static void fsg_lun_attr_release(struct config_item *item)
kfree(lun_opts);
}
-static struct configfs_item_operations fsg_lun_item_ops = {
+static const struct configfs_item_operations fsg_lun_item_ops = {
.release = fsg_lun_attr_release,
};
@@ -3311,7 +3319,7 @@ static struct config_group *fsg_lun_make(struct config_group *group,
goto out;
}
- opts = kzalloc(sizeof(*opts), GFP_KERNEL);
+ opts = kzalloc_obj(*opts);
if (!opts) {
ret = -ENOMEM;
goto out;
@@ -3369,7 +3377,7 @@ static void fsg_attr_release(struct config_item *item)
usb_put_function_instance(&opts->func_inst);
}
-static struct configfs_item_operations fsg_item_ops = {
+static const struct configfs_item_operations fsg_item_ops = {
.release = fsg_attr_release,
};
@@ -3462,7 +3470,7 @@ static struct configfs_attribute *fsg_attrs[] = {
NULL,
};
-static struct configfs_group_operations fsg_group_ops = {
+static const struct configfs_group_operations fsg_group_ops = {
.make_group = fsg_lun_make,
.drop_item = fsg_lun_drop,
};
@@ -3489,7 +3497,7 @@ static struct usb_function_instance *fsg_alloc_inst(void)
struct fsg_lun_config config;
int rc;
- opts = kzalloc(sizeof(*opts), GFP_KERNEL);
+ opts = kzalloc_obj(*opts);
if (!opts)
return ERR_PTR(-ENOMEM);
mutex_init(&opts->lock);
@@ -3554,7 +3562,7 @@ static struct usb_function *fsg_alloc(struct usb_function_instance *fi)
struct fsg_common *common = opts->common;
struct fsg_dev *fsg;
- fsg = kzalloc(sizeof(*fsg), GFP_KERNEL);
+ fsg = kzalloc_obj(*fsg);
if (unlikely(!fsg))
return ERR_PTR(-ENOMEM);