[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