[PATCH 02/17] Let calloc handle multiplication

walter harms wharms at bfs.de
Wed Apr 1 02:18:05 PDT 2015


hi alan,
what is the strategy here ?

xnfcalloc never fails, but exits on OOM conditions.
other function return BADALLOC.

now, there is a mix.

re,
 wh

Am 01.04.2015 02:50, schrieb Alan Coopersmith:
> It's going to multiply anyway, so if we have non-constant values, might
> as well let it do the multiplication instead of adding another multiply,
> and good versions of calloc will check for & avoid overflow in the process.
> 
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
> ---
>  Xext/panoramiXprocs.c             |    2 +-
>  Xi/xiquerypointer.c               |    4 ++--
>  dix/dispatch.c                    |    6 +++---
>  dix/glyphcurs.c                   |    4 +---
>  hw/xfree86/common/xf86Bus.c       |    2 +-
>  hw/xfree86/common/xf86Config.c    |    2 +-
>  hw/xfree86/common/xf86Configure.c |    4 ++--
>  7 files changed, 11 insertions(+), 13 deletions(-)
> 
> diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c
> index 413a66a..5291a4a 100644
> --- a/Xext/panoramiXprocs.c
> +++ b/Xext/panoramiXprocs.c
> @@ -1106,7 +1106,7 @@ PanoramiXCopyArea(ClientPtr client)
>          }
>  
>          pitch = PixmapBytePad(stuff->width, drawables[0]->depth);
> -        if (!(data = calloc(1, stuff->height * pitch)))
> +        if (!(data = calloc(stuff->height, pitch)))
>              return BadAlloc;
>  
>          XineramaGetImageData(drawables, srcx, srcy,
> diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
> index 7ec0c85..b9e2958 100644
> --- a/Xi/xiquerypointer.c
> +++ b/Xi/xiquerypointer.c
> @@ -152,10 +152,10 @@ ProcXIQueryPointer(ClientPtr client)
>          rep.buttons_len =
>              bytes_to_int32(bits_to_bytes(pDev->button->numButtons));
>          rep.length += rep.buttons_len;
> -        buttons_size = rep.buttons_len * 4;
> -        buttons = calloc(1, buttons_size);
> +        buttons = calloc(rep.buttons_len, 4);
>          if (!buttons)
>              return BadAlloc;
> +        buttons_size = rep.buttons_len * 4;
>  
>          for (i = 1; i < pDev->button->numButtons; i++)
>              if (BitIsOn(pDev->button->down, i))
> diff --git a/dix/dispatch.c b/dix/dispatch.c
> index 17fa75e..7dcdeab 100644
> --- a/dix/dispatch.c
> +++ b/dix/dispatch.c
> @@ -2786,7 +2786,7 @@ ProcQueryColors(ClientPtr client)
>  
>          count =
>              bytes_to_int32((client->req_len << 2) - sizeof(xQueryColorsReq));
> -        prgbs = calloc(1, count * sizeof(xrgb));
> +        prgbs = calloc(count, sizeof(xrgb));
>          if (!prgbs && count)
>              return BadAlloc;
>          if ((rc =
> @@ -2908,10 +2908,10 @@ ProcCreateCursor(ClientPtr client)
>      if (stuff->x > width || stuff->y > height)
>          return BadMatch;
>  
> -    n = BitmapBytePad(width) * height;
> -    srcbits = calloc(1, n);
> +    srcbits = calloc(BitmapBytePad(width), height);
>      if (!srcbits)
>          return BadAlloc;
> +    n = BitmapBytePad(width) * height;
>      mskbits = malloc(n);
>      if (!mskbits) {
>          free(srcbits);
> diff --git a/dix/glyphcurs.c b/dix/glyphcurs.c
> index eca6a4c..3ff6ae8 100644
> --- a/dix/glyphcurs.c
> +++ b/dix/glyphcurs.c
> @@ -78,7 +78,6 @@ ServerBitsFromGlyph(FontPtr pfont, unsigned ch, CursorMetricPtr cm,
>      GCPtr pGC;
>      xRectangle rect;
>      PixmapPtr ppix;
> -    long nby;
>      char *pbits;
>      ChangeGCVal gcval[3];
>      unsigned char char2b[2];
> @@ -88,8 +87,7 @@ ServerBitsFromGlyph(FontPtr pfont, unsigned ch, CursorMetricPtr cm,
>      char2b[1] = (unsigned char) (ch & 0xff);
>  
>      pScreen = screenInfo.screens[0];
> -    nby = BitmapBytePad(cm->width) * (long) cm->height;
> -    pbits = calloc(1, nby);
> +    pbits = calloc(BitmapBytePad(cm->width), cm->height);
>      if (!pbits)
>          return BadAlloc;
>  
> diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
> index 889294f..02f7bf2 100644
> --- a/hw/xfree86/common/xf86Bus.c
> +++ b/hw/xfree86/common/xf86Bus.c
> @@ -260,7 +260,7 @@ xf86AllocateEntity(void)
>                                sizeof(EntityPtr) * xf86NumEntities);
>      xf86Entities[xf86NumEntities - 1] = xnfcalloc(1, sizeof(EntityRec));
>      xf86Entities[xf86NumEntities - 1]->entityPrivates =
> -        xnfcalloc(sizeof(DevUnion) * xf86EntityPrivateCount, 1);
> +        xnfcalloc(xf86EntityPrivateCount, sizeof(DevUnion));
>      return xf86NumEntities - 1;
>  }
>  
> diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
> index d42572f..098d2dd 100644
> --- a/hw/xfree86/common/xf86Config.c
> +++ b/hw/xfree86/common/xf86Config.c
> @@ -1502,7 +1502,7 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
>      if (!count)                 /* alloc enough storage even if no screen is specified */
>          count = 1;
>  
> -    slp = xnfcalloc(1, (count + 1) * sizeof(screenLayoutRec));
> +    slp = xnfcalloc((count + 1), sizeof(screenLayoutRec));
>      slp[count].screen = NULL;
>      /*
>       * now that we have storage, loop over the list again and fill in our
> diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c
> index cc7ff1b..7ab378f 100644
> --- a/hw/xfree86/common/xf86Configure.c
> +++ b/hw/xfree86/common/xf86Configure.c
> @@ -645,10 +645,10 @@ DoConfigure(void)
>  
>      xf86DoConfigurePass1 = FALSE;
>  
> -    dev2screen = xnfcalloc(1, xf86NumDrivers * sizeof(int));
> +    dev2screen = xnfcalloc(xf86NumDrivers, sizeof(int));
>  
>      {
> -        Bool *driverProbed = xnfcalloc(1, xf86NumDrivers * sizeof(Bool));
> +        Bool *driverProbed = xnfcalloc(xf86NumDrivers, sizeof(Bool));
>  
>          for (screennum = 0; screennum < nDevToConfig; screennum++) {
>              int k, l, n, oldNumScreens;


More information about the xorg-devel mailing list