Module Name: xsrc
Committed By: mrg
Date: Fri Aug 12 08:18:29 UTC 2022
Modified Files:
xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting:
drmmode_display.c
Log Message:
avoid variable stack arrays.
USE_SSP=yes builds don't work with this new xorg-server version, adjust
the drmmode_set_gamma_lut() call to use malloc() instead of the stack,
and pass down a higher level pointer to gain access to the screen index
so error messages with xf86DrvMsg() work.
tested on pinebookpro.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 \
xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c
diff -u xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c:1.10 xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c:1.11
--- xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c:1.10 Wed Jul 20 03:51:16 2022
+++ xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c Fri Aug 12 08:18:29 2022
@@ -1736,16 +1736,23 @@ drmmode_show_cursor(xf86CrtcPtr crtc)
}
static void
-drmmode_set_gamma_lut(drmmode_crtc_private_ptr drmmode_crtc,
+drmmode_set_gamma_lut(xf86CrtcPtr crtc,
uint16_t * red, uint16_t * green, uint16_t * blue,
int size)
{
+ drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
drmmode_prop_info_ptr gamma_lut_info =
&drmmode_crtc->props[DRMMODE_CRTC_GAMMA_LUT];
const uint32_t crtc_id = drmmode_crtc->mode_crtc->crtc_id;
uint32_t blob_id;
- struct drm_color_lut lut[size];
+ struct drm_color_lut *lut = malloc(sizeof(*lut) * size);
+
+ if (lut == NULL) {
+ xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
+ "Failed to allocate memory for %d LUT entries.\n", size);
+ return;
+ }
assert(gamma_lut_info->prop_id != 0);
@@ -1755,13 +1762,14 @@ drmmode_set_gamma_lut(drmmode_crtc_priva
lut[i].blue = blue[i];
}
- if (drmModeCreatePropertyBlob(drmmode->fd, lut, sizeof(lut), &blob_id))
- return;
+ if (!drmModeCreatePropertyBlob(drmmode->fd, lut, sizeof(lut), &blob_id)) {
- drmModeObjectSetProperty(drmmode->fd, crtc_id, DRM_MODE_OBJECT_CRTC,
- gamma_lut_info->prop_id, blob_id);
+ drmModeObjectSetProperty(drmmode->fd, crtc_id, DRM_MODE_OBJECT_CRTC,
+ gamma_lut_info->prop_id, blob_id);
- drmModeDestroyPropertyBlob(drmmode->fd, blob_id);
+ drmModeDestroyPropertyBlob(drmmode->fd, blob_id);
+ }
+ free(lut);
}
static void
@@ -1772,7 +1780,7 @@ drmmode_crtc_gamma_set(xf86CrtcPtr crtc,
drmmode_ptr drmmode = drmmode_crtc->drmmode;
if (drmmode_crtc->use_gamma_lut) {
- drmmode_set_gamma_lut(drmmode_crtc, red, green, blue, size);
+ drmmode_set_gamma_lut(crtc, red, green, blue, size);
} else {
drmModeCrtcSetGamma(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
size, red, green, blue);