treewide: Use array_size() in vmalloc()
The vmalloc() function has no 2-factor argument form, so multiplication factors need to be wrapped in array_size(). This patch replaces cases of: vmalloc(a * b) with: vmalloc(array_size(a, b)) as well as handling cases of: vmalloc(a * b * c) with: vmalloc(array3_size(a, b, c)) This does, however, attempt to ignore constant size factors like: vmalloc(4 * 1024) 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 Coccinelle script used for this was: // Fix redundant parens around sizeof(). @@ type TYPE; expression THING, E; @@ ( vmalloc( - (sizeof(TYPE)) * E + sizeof(TYPE) * E , ...) | vmalloc( - (sizeof(THING)) * E + sizeof(THING) * E , ...) ) // Drop single-byte sizes and redundant parens. @@ expression COUNT; typedef u8; typedef __u8; @@ ( vmalloc( - sizeof(u8) * (COUNT) + COUNT , ...) | vmalloc( - sizeof(__u8) * (COUNT) + COUNT , ...) | vmalloc( - sizeof(char) * (COUNT) + COUNT , ...) | vmalloc( - sizeof(unsigned char) * (COUNT) + COUNT , ...) | vmalloc( - sizeof(u8) * COUNT + COUNT , ...) | vmalloc( - sizeof(__u8) * COUNT + COUNT , ...) | vmalloc( - sizeof(char) * COUNT + COUNT , ...) | vmalloc( - 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; @@ ( vmalloc( - sizeof(TYPE) * (COUNT_ID) + array_size(COUNT_ID, sizeof(TYPE)) , ...) | vmalloc( - sizeof(TYPE) * COUNT_ID + array_size(COUNT_ID, sizeof(TYPE)) , ...) | vmalloc( - sizeof(TYPE) * (COUNT_CONST) + array_size(COUNT_CONST, sizeof(TYPE)) , ...) | vmalloc( - sizeof(TYPE) * COUNT_CONST + array_size(COUNT_CONST, sizeof(TYPE)) , ...) | vmalloc( - sizeof(THING) * (COUNT_ID) + array_size(COUNT_ID, sizeof(THING)) , ...) | vmalloc( - sizeof(THING) * COUNT_ID + array_size(COUNT_ID, sizeof(THING)) , ...) | vmalloc( - sizeof(THING) * (COUNT_CONST) + array_size(COUNT_CONST, sizeof(THING)) , ...) | vmalloc( - sizeof(THING) * COUNT_CONST + array_size(COUNT_CONST, sizeof(THING)) , ...) ) // 2-factor product, only identifiers. @@ identifier SIZE, COUNT; @@ vmalloc( - SIZE * COUNT + array_size(COUNT, SIZE) , ...) // 3-factor product with 1 sizeof(type) or sizeof(expression), with // redundant parens removed. @@ expression THING; identifier STRIDE, COUNT; type TYPE; @@ ( vmalloc( - sizeof(TYPE) * (COUNT) * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | vmalloc( - sizeof(TYPE) * (COUNT) * STRIDE + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | vmalloc( - sizeof(TYPE) * COUNT * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | vmalloc( - sizeof(TYPE) * COUNT * STRIDE + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | vmalloc( - sizeof(THING) * (COUNT) * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | vmalloc( - sizeof(THING) * (COUNT) * STRIDE + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | vmalloc( - sizeof(THING) * COUNT * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | vmalloc( - 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; @@ ( vmalloc( - sizeof(TYPE1) * sizeof(TYPE2) * COUNT + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2)) , ...) | vmalloc( - sizeof(TYPE1) * sizeof(THING2) * (COUNT) + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2)) , ...) | vmalloc( - sizeof(THING1) * sizeof(THING2) * COUNT + array3_size(COUNT, sizeof(THING1), sizeof(THING2)) , ...) | vmalloc( - sizeof(THING1) * sizeof(THING2) * (COUNT) + array3_size(COUNT, sizeof(THING1), sizeof(THING2)) , ...) | vmalloc( - sizeof(TYPE1) * sizeof(THING2) * COUNT + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2)) , ...) | vmalloc( - 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; @@ ( vmalloc( - (COUNT) * STRIDE * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | vmalloc( - COUNT * (STRIDE) * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | vmalloc( - COUNT * STRIDE * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | vmalloc( - (COUNT) * (STRIDE) * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | vmalloc( - COUNT * (STRIDE) * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | vmalloc( - (COUNT) * STRIDE * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | vmalloc( - (COUNT) * (STRIDE) * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | vmalloc( - 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; @@ ( vmalloc(C1 * C2 * C3, ...) | vmalloc( - E1 * E2 * E3 + array3_size(E1, E2, E3) , ...) ) // And then all remaining 2 factors products when they're not all constants. @@ expression E1, E2; constant C1, C2; @@ ( vmalloc(C1 * C2, ...) | vmalloc( - E1 * E2 + array_size(E1, E2) , ...) ) Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
@@ -389,7 +389,8 @@ int snd_seq_pool_init(struct snd_seq_pool *pool)
|
||||
if (snd_BUG_ON(!pool))
|
||||
return -EINVAL;
|
||||
|
||||
cellptr = vmalloc(sizeof(struct snd_seq_event_cell) * pool->size);
|
||||
cellptr = vmalloc(array_size(sizeof(struct snd_seq_event_cell),
|
||||
pool->size));
|
||||
if (!cellptr)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -240,8 +240,9 @@ struct dsp_spos_instance *cs46xx_dsp_spos_create (struct snd_cs46xx * chip)
|
||||
return NULL;
|
||||
|
||||
/* better to use vmalloc for this big table */
|
||||
ins->symbol_table.symbols = vmalloc(sizeof(struct dsp_symbol_entry) *
|
||||
DSP_MAX_SYMBOLS);
|
||||
ins->symbol_table.symbols =
|
||||
vmalloc(array_size(DSP_MAX_SYMBOLS,
|
||||
sizeof(struct dsp_symbol_entry)));
|
||||
ins->code.data = kmalloc(DSP_CODE_BYTE_SIZE, GFP_KERNEL);
|
||||
ins->modules = kmalloc_array(DSP_MAX_MODULES,
|
||||
sizeof(struct dsp_module_desc),
|
||||
|
@@ -1941,9 +1941,10 @@ int snd_emu10k1_create(struct snd_card *card,
|
||||
(unsigned long)emu->ptb_pages.addr,
|
||||
(unsigned long)(emu->ptb_pages.addr + emu->ptb_pages.bytes));
|
||||
|
||||
emu->page_ptr_table = vmalloc(emu->max_cache_pages * sizeof(void *));
|
||||
emu->page_addr_table = vmalloc(emu->max_cache_pages *
|
||||
sizeof(unsigned long));
|
||||
emu->page_ptr_table = vmalloc(array_size(sizeof(void *),
|
||||
emu->max_cache_pages));
|
||||
emu->page_addr_table = vmalloc(array_size(sizeof(unsigned long),
|
||||
emu->max_cache_pages));
|
||||
if (emu->page_ptr_table == NULL || emu->page_addr_table == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
@@ -2099,7 +2100,7 @@ static int alloc_pm_buffer(struct snd_emu10k1 *emu)
|
||||
size = ARRAY_SIZE(saved_regs);
|
||||
if (emu->audigy)
|
||||
size += ARRAY_SIZE(saved_regs_audigy);
|
||||
emu->saved_ptr = vmalloc(4 * NUM_G * size);
|
||||
emu->saved_ptr = vmalloc(array3_size(4, NUM_G, size));
|
||||
if (!emu->saved_ptr)
|
||||
return -ENOMEM;
|
||||
if (snd_emu10k1_efx_alloc_pm_buffer(emu) < 0)
|
||||
|
@@ -2692,7 +2692,7 @@ int snd_emu10k1_efx_alloc_pm_buffer(struct snd_emu10k1 *emu)
|
||||
if (! emu->tram_val_saved || ! emu->tram_addr_saved)
|
||||
return -ENOMEM;
|
||||
len = emu->audigy ? 2 * 1024 : 2 * 512;
|
||||
emu->saved_icode = vmalloc(len * 4);
|
||||
emu->saved_icode = vmalloc(array_size(len, 4));
|
||||
if (! emu->saved_icode)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
@@ -874,7 +874,7 @@ int snd_p16v_mixer(struct snd_emu10k1 *emu)
|
||||
|
||||
int snd_p16v_alloc_pm_buffer(struct snd_emu10k1 *emu)
|
||||
{
|
||||
emu->p16v_saved = vmalloc(NUM_CHS * 4 * 0x80);
|
||||
emu->p16v_saved = vmalloc(array_size(NUM_CHS * 4, 0x80));
|
||||
if (! emu->p16v_saved)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
@@ -2657,7 +2657,10 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci,
|
||||
chip->irq = pci->irq;
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
chip->suspend_mem = vmalloc(sizeof(u16) * (REV_B_CODE_MEMORY_LENGTH + REV_B_DATA_MEMORY_LENGTH));
|
||||
chip->suspend_mem =
|
||||
vmalloc(array_size(sizeof(u16),
|
||||
REV_B_CODE_MEMORY_LENGTH +
|
||||
REV_B_DATA_MEMORY_LENGTH));
|
||||
if (chip->suspend_mem == NULL)
|
||||
dev_warn(card->dev, "can't allocate apm buffer\n");
|
||||
#endif
|
||||
|
@@ -3362,7 +3362,9 @@ static int snd_trident_tlb_alloc(struct snd_trident *trident)
|
||||
trident->tlb.entries = (unsigned int*)ALIGN((unsigned long)trident->tlb.buffer.area, SNDRV_TRIDENT_MAX_PAGES * 4);
|
||||
trident->tlb.entries_dmaaddr = ALIGN(trident->tlb.buffer.addr, SNDRV_TRIDENT_MAX_PAGES * 4);
|
||||
/* allocate shadow TLB page table (virtual addresses) */
|
||||
trident->tlb.shadow_entries = vmalloc(SNDRV_TRIDENT_MAX_PAGES*sizeof(unsigned long));
|
||||
trident->tlb.shadow_entries =
|
||||
vmalloc(array_size(SNDRV_TRIDENT_MAX_PAGES,
|
||||
sizeof(unsigned long)));
|
||||
if (!trident->tlb.shadow_entries)
|
||||
return -ENOMEM;
|
||||
|
||||
|
Reference in New Issue
Block a user