diff --git a/randr/rrmonitor.c b/randr/rrmonitor.c index 661dee32e..db33d117c 100644 --- a/randr/rrmonitor.c +++ b/randr/rrmonitor.c @@ -604,13 +604,11 @@ ProcRRGetMonitors(ClientPtr client) noutputs += monitors[m].numOutputs; } - int payload_len = noutputs * sizeof(CARD32) + nmonitors * sizeof(xRRMonitorInfo); - xRRGetMonitorsReply rep = { .type = X_Reply, .sequenceNumber = client->sequence, .timestamp = RRMonitorTimestamp(screen), - .length = bytes_to_int32(payload_len), + .length = noutputs + nmonitors * bytes_to_int32(sizeof(xRRMonitorInfo)), .nmonitors = nmonitors, .noutputs = noutputs, }; @@ -624,18 +622,9 @@ ProcRRGetMonitors(ClientPtr client) } WriteToClient(client, sizeof(xRRGetMonitorsReply), &rep); - char *payload_buf = calloc(1, payload_len); - if (!payload_buf) { - RRMonitorFreeList(monitors, nmonitors); - return BadAlloc; - } - - char *walk = payload_buf; - for (m = 0; m < nmonitors; m++) { RRMonitorPtr monitor = &monitors[m]; - xRRMonitorInfo *info = (xRRMonitorInfo*) walk; - *info = (xRRMonitorInfo) { + xRRMonitorInfo info = { .name = monitor->name, .primary = monitor->primary, .automatic = monitor->automatic, @@ -648,27 +637,26 @@ ProcRRGetMonitors(ClientPtr client) .heightInMillimeters = monitor->geometry.mmHeight, }; if (client->swapped) { - swapl(&info->name); - swaps(&info->noutput); - swaps(&info->x); - swaps(&info->y); - swaps(&info->width); - swaps(&info->height); - swapl(&info->widthInMillimeters); - swapl(&info->heightInMillimeters); + swapl(&info.name); + swaps(&info.noutput); + swaps(&info.x); + swaps(&info.y); + swaps(&info.width); + swaps(&info.height); + swapl(&info.widthInMillimeters); + swapl(&info.heightInMillimeters); } - walk += sizeof(xRRMonitorInfo); - memcpy(walk, monitor->outputs, monitor->numOutputs * sizeof (RROutput)); - if (client->swapped) - SwapLongs((CARD32*)walk, monitor->numOutputs); + RROutput outputs[monitor->numOutputs]; + memcpy(outputs, monitor->outputs, monitor->numOutputs * sizeof (RROutput)); - walk += monitor->numOutputs * sizeof (RROutput); + if (client->swapped) + SwapLongs(outputs, monitor->numOutputs); + + WriteToClient(client, sizeof(xRRMonitorInfo), &info); + WriteToClient(client, sizeof(outputs), outputs); } - WriteToClient(client, payload_len, payload_buf); - - free(payload_buf); RRMonitorFreeList(monitors, nmonitors); return Success;