[Mesa-dev] [PATCH 1/2] Eliminate several cases of multiplication in arguments to calloc

Matt Turner mattst88 at gmail.com
Wed Sep 3 16:40:43 PDT 2014


On Wed, Sep 3, 2014 at 4:09 PM, Carl Worth <cworth at cworth.org> wrote:
> In commit 32f2fd1c5d6088692551c80352b7d6fa35b0cd09, several calls to
> _mesa_calloc(x) were replaced with calls to calloc(1, x). This is strictly
> equivalent to what the code was doing previously.
>
> But for cases where "x" involves multiplication, now that we are explicitly
> using the two-argument calloc, we can do one step better and replace:
>
>         calloc(1, A * B);
>
> with:
>
>         calloc(A, B);
>
> The advantage of the latter is that calloc will detect any overflow that would
> have resulted from the multiplication and will fail the allocation, (whereas
> the former would return a small allocation). So this fix can change
> potentially exploitable buffer overruns into segmentation faults.
> ---
>  src/gallium/drivers/freedreno/a2xx/ir-a2xx.c | 2 +-
>  src/gallium/drivers/freedreno/ir3/ir3.c      | 2 +-
>  src/gallium/drivers/r600/r600_asm.c          | 2 +-
>  src/mapi/glapi/gen/gl_gentable.py            | 2 +-
>  src/mesa/drivers/dri/common/utils.c          | 2 +-
>  src/mesa/drivers/dri/i965/brw_state_cache.c  | 4 ++--
>  src/mesa/main/atifragshader.c                | 8 ++++----
>  src/mesa/program/prog_instruction.c          | 2 +-
>  src/mesa/program/prog_optimize.c             | 6 +++---
>  src/mesa/program/prog_parameter.c            | 2 +-
>  src/mesa/vbo/vbo_exec_array.c                | 2 +-
>  11 files changed, 17 insertions(+), 17 deletions(-)
>
> diff --git a/src/gallium/drivers/freedreno/a2xx/ir-a2xx.c b/src/gallium/drivers/freedreno/a2xx/ir-a2xx.c
> index 18afba8..cff5a27 100644
> --- a/src/gallium/drivers/freedreno/a2xx/ir-a2xx.c
> +++ b/src/gallium/drivers/freedreno/a2xx/ir-a2xx.c
> @@ -146,7 +146,7 @@ void * ir2_shader_assemble(struct ir2_shader *shader, struct ir2_shader_info *in
>                 goto fail;
>         }
>
> -       ptr = dwords = calloc(1, 4 * info->sizedwords);
> +       ptr = dwords = calloc(4, info->sizedwords);
>
>         /* second pass, emit CF program in pairs: */
>         for (i = 0; i < shader->cfs_count; i += 2) {
> diff --git a/src/gallium/drivers/freedreno/ir3/ir3.c b/src/gallium/drivers/freedreno/ir3/ir3.c
> index ea2a925..3da10fb 100644
> --- a/src/gallium/drivers/freedreno/ir3/ir3.c
> +++ b/src/gallium/drivers/freedreno/ir3/ir3.c
> @@ -554,7 +554,7 @@ void * ir3_assemble(struct ir3 *shader, struct ir3_info *info)
>          */
>         info->sizedwords = 2 * align(shader->instrs_count, 4);
>
> -       ptr = dwords = calloc(1, 4 * info->sizedwords);
> +       ptr = dwords = calloc(4, info->sizedwords);
>
>         for (i = 0; i < shader->instrs_count; i++) {
>                 struct ir3_instruction *instr = shader->instrs[i];
> diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c
> index 4da918c..8aa69b5 100644
> --- a/src/gallium/drivers/r600/r600_asm.c
> +++ b/src/gallium/drivers/r600/r600_asm.c
> @@ -1590,7 +1590,7 @@ int r600_bytecode_build(struct r600_bytecode *bc)
>                 bc->ndw = cf->addr + cf->ndw;
>         }
>         free(bc->bytecode);
> -       bc->bytecode = calloc(1, bc->ndw * 4);
> +       bc->bytecode = calloc(4, bc->ndw);
>         if (bc->bytecode == NULL)
>                 return -ENOMEM;
>         LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
> diff --git a/src/mapi/glapi/gen/gl_gentable.py b/src/mapi/glapi/gen/gl_gentable.py
> index 7577b66..ce9af99 100644
> --- a/src/mapi/glapi/gen/gl_gentable.py
> +++ b/src/mapi/glapi/gen/gl_gentable.py
> @@ -113,7 +113,7 @@ __glapi_gentable_set_remaining_noop(struct _glapi_table *disp) {
>
>  struct _glapi_table *
>  _glapi_create_table_from_handle(void *handle, const char *symbol_prefix) {
> -    struct _glapi_table *disp = calloc(1, _glapi_get_dispatch_table_size() * sizeof(_glapi_proc));
> +    struct _glapi_table *disp = calloc(_glapi_get_dispatch_table_size(), sizeof(_glapi_proc));
>      char symboln[512];
>
>      if(!disp)
> diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c
> index e0b3db8..1f30966 100644
> --- a/src/mesa/drivers/dri/common/utils.c
> +++ b/src/mesa/drivers/dri/common/utils.c
> @@ -238,7 +238,7 @@ driCreateConfigs(mesa_format format,
>     is_srgb = _mesa_get_format_color_encoding(format) == GL_SRGB;
>
>     num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits * num_msaa_modes;
> -   configs = calloc(1, (num_modes + 1) * sizeof *configs);
> +   configs = calloc((num_modes + 1), sizeof *configs);

I'd drop the extra parentheses.

With that, both are

Reviewed-by: Matt Turner <mattst88 at gmail.com>


More information about the mesa-dev mailing list