randr: ProcRRGetProviders(): use stack for tiny temporary buffer

The reply payload buffer is very small and short-lived, so we can easily
use a local dynamic array for that, thus saving an extra heap alloc/free.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult
2024-07-29 19:22:19 +02:00
parent b870d60762
commit 972dbf7bfd

View File

@@ -60,7 +60,6 @@ ProcRRGetProviders (ClientPtr client)
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
int rc;
CARD8 *extra;
unsigned int extraLen;
RRProvider *providers;
int total_providers = 0, count_providers = 0;
@@ -96,6 +95,7 @@ ProcRRGetProviders (ClientPtr client)
}
extraLen = total_providers * sizeof(CARD32);
char extra[extraLen];
xRRGetProvidersReply rep = {
.type = X_Reply,
@@ -105,13 +105,6 @@ ProcRRGetProviders (ClientPtr client)
.length = bytes_to_int32(extraLen),
};
if (extraLen) {
extra = malloc(extraLen);
if (!extra)
return BadAlloc;
} else
extra = NULL;
providers = (RRProvider *)extra;
ADD_PROVIDER(pScreen);
xorg_list_for_each_entry(iter, &pScreen->secondary_list, secondary_head) {
@@ -125,11 +118,7 @@ ProcRRGetProviders (ClientPtr client)
swaps(&rep.nProviders);
}
WriteToClient(client, sizeof(xRRGetProvidersReply), (char *)&rep);
if (extraLen)
{
WriteToClient (client, extraLen, (char *) extra);
free(extra);
}
WriteToClient(client, extraLen, extra);
return Success;
}