diff --git a/randr/rrscreen.c b/randr/rrscreen.c index 395b5738e..4932159e8 100644 --- a/randr/rrscreen.c +++ b/randr/rrscreen.c @@ -794,13 +794,8 @@ ProcRRGetScreenInfo(ClientPtr client) extraLen = 0; } else { - int i, j; - xScreenSizes *size; - CARD16 *rates; - CARD8 *data8; Bool has_rate = RRClientKnowsRates(client); RR10DataPtr pData; - RRScreenSizePtr pSize; pData = RR10GetData(pScreen, output); if (!pData) @@ -826,55 +821,62 @@ ProcRRGetScreenInfo(ClientPtr client) extraLen += rep.nrateEnts * sizeof(CARD16); if (extraLen) { + xScreenSizes *size; + CARD16 *rates; + CARD8 *data8; + extra = (CARD8 *) malloc(extraLen); if (!extra) { free(pData); return BadAlloc; } - } - else - extra = NULL; - /* - * First comes the size information - */ - size = (xScreenSizes *) extra; - rates = (CARD16 *) (size + rep.nSizes); - for (i = 0; i < pData->nsize; i++) { - pSize = &pData->sizes[i]; - size->widthInPixels = pSize->width; - size->heightInPixels = pSize->height; - size->widthInMillimeters = pSize->mmWidth; - size->heightInMillimeters = pSize->mmHeight; - if (client->swapped) { - swaps(&size->widthInPixels); - swaps(&size->heightInPixels); - swaps(&size->widthInMillimeters); - swaps(&size->heightInMillimeters); - } - size++; - if (has_rate) { - *rates = pSize->nRates; + /* + * First comes the size information + */ + size = (xScreenSizes *) extra; + rates = (CARD16 *) (size + rep.nSizes); + for (int i = 0; i < pData->nsize; i++) { + RRScreenSizePtr pSize = &pData->sizes[i]; + + size->widthInPixels = pSize->width; + size->heightInPixels = pSize->height; + size->widthInMillimeters = pSize->mmWidth; + size->heightInMillimeters = pSize->mmHeight; if (client->swapped) { - swaps(rates); + swaps(&size->widthInPixels); + swaps(&size->heightInPixels); + swaps(&size->widthInMillimeters); + swaps(&size->heightInMillimeters); } - rates++; - for (j = 0; j < pSize->nRates; j++) { - *rates = pSize->pRates[j].rate; + size++; + if (has_rate) { + *rates = pSize->nRates; if (client->swapped) { swaps(rates); } rates++; + for (int j = 0; j < pSize->nRates; j++) { + *rates = pSize->pRates[j].rate; + if (client->swapped) { + swaps(rates); + } + rates++; + } } } + + data8 = (CARD8 *) rates; + + if (data8 - (CARD8 *) extra != extraLen) + FatalError("RRGetScreenInfo bad extra len %ld != %ld\n", + (unsigned long) (data8 - (CARD8 *) extra), extraLen); } + else + extra = NULL; + free(pData); - data8 = (CARD8 *) rates; - - if (data8 - (CARD8 *) extra != extraLen) - FatalError("RRGetScreenInfo bad extra len %ld != %ld\n", - (unsigned long) (data8 - (CARD8 *) extra), extraLen); rep.length = bytes_to_int32(extraLen); } if (client->swapped) {