treewide: kmalloc() -> kmalloc_array()
The kmalloc() function has a 2-factor argument form, kmalloc_array(). This patch replaces cases of: kmalloc(a * b, gfp) with: kmalloc_array(a * b, gfp) as well as handling cases of: kmalloc(a * b * c, gfp) with: kmalloc(array3_size(a, b, c), gfp) as it's slightly less ugly than: kmalloc_array(array_size(a, b), c, gfp) This does, however, attempt to ignore constant size factors like: kmalloc(4 * 1024, gfp) though any constants defined via macros get caught up in the conversion. Any factors with a sizeof() of "unsigned char", "char", and "u8" were dropped, since they're redundant. The tools/ directory was manually excluded, since it has its own implementation of kmalloc(). The Coccinelle script used for this was: // Fix redundant parens around sizeof(). @@ type TYPE; expression THING, E; @@ ( kmalloc( - (sizeof(TYPE)) * E + sizeof(TYPE) * E , ...) | kmalloc( - (sizeof(THING)) * E + sizeof(THING) * E , ...) ) // Drop single-byte sizes and redundant parens. @@ expression COUNT; typedef u8; typedef __u8; @@ ( kmalloc( - sizeof(u8) * (COUNT) + COUNT , ...) | kmalloc( - sizeof(__u8) * (COUNT) + COUNT , ...) | kmalloc( - sizeof(char) * (COUNT) + COUNT , ...) | kmalloc( - sizeof(unsigned char) * (COUNT) + COUNT , ...) | kmalloc( - sizeof(u8) * COUNT + COUNT , ...) | kmalloc( - sizeof(__u8) * COUNT + COUNT , ...) | kmalloc( - sizeof(char) * COUNT + COUNT , ...) | kmalloc( - sizeof(unsigned char) * COUNT + COUNT , ...) ) // 2-factor product with sizeof(type/expression) and identifier or constant. @@ type TYPE; expression THING; identifier COUNT_ID; constant COUNT_CONST; @@ ( - kmalloc + kmalloc_array ( - sizeof(TYPE) * (COUNT_ID) + COUNT_ID, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * COUNT_ID + COUNT_ID, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * (COUNT_CONST) + COUNT_CONST, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * COUNT_CONST + COUNT_CONST, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * (COUNT_ID) + COUNT_ID, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * COUNT_ID + COUNT_ID, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * (COUNT_CONST) + COUNT_CONST, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * COUNT_CONST + COUNT_CONST, sizeof(THING) , ...) ) // 2-factor product, only identifiers. @@ identifier SIZE, COUNT; @@ - kmalloc + kmalloc_array ( - SIZE * COUNT + COUNT, SIZE , ...) // 3-factor product with 1 sizeof(type) or sizeof(expression), with // redundant parens removed. @@ expression THING; identifier STRIDE, COUNT; type TYPE; @@ ( kmalloc( - sizeof(TYPE) * (COUNT) * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | kmalloc( - sizeof(TYPE) * (COUNT) * STRIDE + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | kmalloc( - sizeof(TYPE) * COUNT * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | kmalloc( - sizeof(TYPE) * COUNT * STRIDE + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | kmalloc( - sizeof(THING) * (COUNT) * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | kmalloc( - sizeof(THING) * (COUNT) * STRIDE + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | kmalloc( - sizeof(THING) * COUNT * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | kmalloc( - sizeof(THING) * COUNT * STRIDE + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) ) // 3-factor product with 2 sizeof(variable), with redundant parens removed. @@ expression THING1, THING2; identifier COUNT; type TYPE1, TYPE2; @@ ( kmalloc( - sizeof(TYPE1) * sizeof(TYPE2) * COUNT + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2)) , ...) | kmalloc( - sizeof(TYPE1) * sizeof(THING2) * (COUNT) + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2)) , ...) | kmalloc( - sizeof(THING1) * sizeof(THING2) * COUNT + array3_size(COUNT, sizeof(THING1), sizeof(THING2)) , ...) | kmalloc( - sizeof(THING1) * sizeof(THING2) * (COUNT) + array3_size(COUNT, sizeof(THING1), sizeof(THING2)) , ...) | kmalloc( - sizeof(TYPE1) * sizeof(THING2) * COUNT + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2)) , ...) | kmalloc( - sizeof(TYPE1) * sizeof(THING2) * (COUNT) + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2)) , ...) ) // 3-factor product, only identifiers, with redundant parens removed. @@ identifier STRIDE, SIZE, COUNT; @@ ( kmalloc( - (COUNT) * STRIDE * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - COUNT * (STRIDE) * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - COUNT * STRIDE * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - (COUNT) * (STRIDE) * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - COUNT * (STRIDE) * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - (COUNT) * STRIDE * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - (COUNT) * (STRIDE) * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - COUNT * STRIDE * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) ) // Any remaining multi-factor products, first at least 3-factor products, // when they're not all constants... @@ expression E1, E2, E3; constant C1, C2, C3; @@ ( kmalloc(C1 * C2 * C3, ...) | kmalloc( - (E1) * E2 * E3 + array3_size(E1, E2, E3) , ...) | kmalloc( - (E1) * (E2) * E3 + array3_size(E1, E2, E3) , ...) | kmalloc( - (E1) * (E2) * (E3) + array3_size(E1, E2, E3) , ...) | kmalloc( - E1 * E2 * E3 + array3_size(E1, E2, E3) , ...) ) // And then all remaining 2 factors products when they're not all constants, // keeping sizeof() as the second factor argument. @@ expression THING, E1, E2; type TYPE; constant C1, C2, C3; @@ ( kmalloc(sizeof(THING) * C2, ...) | kmalloc(sizeof(TYPE) * C2, ...) | kmalloc(C1 * C2 * C3, ...) | kmalloc(C1 * C2, ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * (E2) + E2, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * E2 + E2, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * (E2) + E2, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * E2 + E2, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - (E1) * E2 + E1, E2 , ...) | - kmalloc + kmalloc_array ( - (E1) * (E2) + E1, E2 , ...) | - kmalloc + kmalloc_array ( - E1 * E2 + E1, E2 , ...) ) Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
@@ -728,7 +728,7 @@ static struct urb **alloc_urbs(struct snd_usb_caiaqdev *cdev, int dir, int *ret)
|
||||
usb_sndisocpipe(usb_dev, ENDPOINT_PLAYBACK) :
|
||||
usb_rcvisocpipe(usb_dev, ENDPOINT_CAPTURE);
|
||||
|
||||
urbs = kmalloc(N_URBS * sizeof(*urbs), GFP_KERNEL);
|
||||
urbs = kmalloc_array(N_URBS, sizeof(*urbs), GFP_KERNEL);
|
||||
if (!urbs) {
|
||||
*ret = -ENOMEM;
|
||||
return NULL;
|
||||
@@ -742,7 +742,8 @@ static struct urb **alloc_urbs(struct snd_usb_caiaqdev *cdev, int dir, int *ret)
|
||||
}
|
||||
|
||||
urbs[i]->transfer_buffer =
|
||||
kmalloc(FRAMES_PER_URB * BYTES_PER_FRAME, GFP_KERNEL);
|
||||
kmalloc_array(BYTES_PER_FRAME, FRAMES_PER_URB,
|
||||
GFP_KERNEL);
|
||||
if (!urbs[i]->transfer_buffer) {
|
||||
*ret = -ENOMEM;
|
||||
return urbs;
|
||||
@@ -857,7 +858,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *cdev)
|
||||
&snd_usb_caiaq_ops);
|
||||
|
||||
cdev->data_cb_info =
|
||||
kmalloc(sizeof(struct snd_usb_caiaq_cb_info) * N_URBS,
|
||||
kmalloc_array(N_URBS, sizeof(struct snd_usb_caiaq_cb_info),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!cdev->data_cb_info)
|
||||
|
@@ -188,7 +188,8 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof
|
||||
*/
|
||||
int r, idx;
|
||||
|
||||
fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL);
|
||||
fp->rate_table = kmalloc_array(nr_rates, sizeof(int),
|
||||
GFP_KERNEL);
|
||||
if (fp->rate_table == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -362,7 +363,7 @@ static int parse_audio_format_rates_v2v3(struct snd_usb_audio *chip,
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
fp->rate_table = kmalloc(sizeof(int) * fp->nr_rates, GFP_KERNEL);
|
||||
fp->rate_table = kmalloc_array(fp->nr_rates, sizeof(int), GFP_KERNEL);
|
||||
if (!fp->rate_table) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free;
|
||||
|
@@ -158,8 +158,10 @@ static int line6_buffer_acquire(struct snd_line6_pcm *line6pcm,
|
||||
|
||||
/* Invoked multiple times in a row so allocate once only */
|
||||
if (!test_and_set_bit(type, &pstr->opened) && !pstr->buffer) {
|
||||
pstr->buffer = kmalloc(line6pcm->line6->iso_buffers *
|
||||
LINE6_ISO_PACKETS * pkt_size, GFP_KERNEL);
|
||||
pstr->buffer =
|
||||
kmalloc(array3_size(line6pcm->line6->iso_buffers,
|
||||
LINE6_ISO_PACKETS, pkt_size),
|
||||
GFP_KERNEL);
|
||||
if (!pstr->buffer)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@@ -2515,7 +2515,7 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid,
|
||||
cval->control = (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR) ?
|
||||
UAC2_CX_CLOCK_SELECTOR : UAC2_SU_SELECTOR;
|
||||
|
||||
namelist = kmalloc(sizeof(char *) * desc->bNrInPins, GFP_KERNEL);
|
||||
namelist = kmalloc_array(desc->bNrInPins, sizeof(char *), GFP_KERNEL);
|
||||
if (!namelist) {
|
||||
kfree(cval);
|
||||
return -ENOMEM;
|
||||
|
@@ -1123,7 +1123,7 @@ static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime,
|
||||
return 0;
|
||||
|
||||
subs->rate_list.list = rate_list =
|
||||
kmalloc(sizeof(int) * count, GFP_KERNEL);
|
||||
kmalloc_array(count, sizeof(int), GFP_KERNEL);
|
||||
if (!subs->rate_list.list)
|
||||
return -ENOMEM;
|
||||
subs->rate_list.count = count;
|
||||
|
@@ -266,7 +266,9 @@ int usX2Y_AsyncSeq04_init(struct usX2Ydev *usX2Y)
|
||||
int err = 0,
|
||||
i;
|
||||
|
||||
if (NULL == (usX2Y->AS04.buffer = kmalloc(URB_DataLen_AsyncSeq*URBS_AsyncSeq, GFP_KERNEL))) {
|
||||
usX2Y->AS04.buffer = kmalloc_array(URBS_AsyncSeq,
|
||||
URB_DataLen_AsyncSeq, GFP_KERNEL);
|
||||
if (NULL == usX2Y->AS04.buffer) {
|
||||
err = -ENOMEM;
|
||||
} else
|
||||
for (i = 0; i < URBS_AsyncSeq; ++i) {
|
||||
|
@@ -436,7 +436,9 @@ static int usX2Y_urbs_allocate(struct snd_usX2Y_substream *subs)
|
||||
}
|
||||
if (!is_playback && !(*purb)->transfer_buffer) {
|
||||
/* allocate a capture buffer per urb */
|
||||
(*purb)->transfer_buffer = kmalloc(subs->maxpacksize * nr_of_packs(), GFP_KERNEL);
|
||||
(*purb)->transfer_buffer =
|
||||
kmalloc_array(subs->maxpacksize,
|
||||
nr_of_packs(), GFP_KERNEL);
|
||||
if (NULL == (*purb)->transfer_buffer) {
|
||||
usX2Y_urbs_release(subs);
|
||||
return -ENOMEM;
|
||||
@@ -662,7 +664,8 @@ static int usX2Y_rate_set(struct usX2Ydev *usX2Y, int rate)
|
||||
err = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
usbdata = kmalloc(sizeof(int) * NOOF_SETRATE_URBS, GFP_KERNEL);
|
||||
usbdata = kmalloc_array(NOOF_SETRATE_URBS, sizeof(int),
|
||||
GFP_KERNEL);
|
||||
if (NULL == usbdata) {
|
||||
err = -ENOMEM;
|
||||
goto cleanup;
|
||||
|
Reference in New Issue
Block a user