glamor: fix segfault on calloc() failure

calloc() can always fail, so we need to prepared for this,
instead of just blindly segfault'ing.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2025-05-14 13:10:07 +02:00
parent 016f62baad
commit b7b526024a

View File

@ -82,6 +82,10 @@ __glamor_compute_clipped_regions(int block_w,
clipped_regions = calloc((end_block_x - start_block_x + 1) clipped_regions = calloc((end_block_x - start_block_x + 1)
* (end_block_y - start_block_y + 1), * (end_block_y - start_block_y + 1),
sizeof(*clipped_regions)); sizeof(*clipped_regions));
if (!clipped_regions) {
*n_region = 0;
return NULL;
}
DEBUGF("startx %d starty %d endx %d endy %d \n", DEBUGF("startx %d starty %d endx %d endy %d \n",
start_x, start_y, end_x, end_y); start_x, start_y, end_x, end_y);
@ -222,6 +226,11 @@ glamor_compute_clipped_regions_ext(PixmapPtr pixmap,
inner_block_w) inner_block_w)
* ((block_h + inner_block_h - 1) / * ((block_h + inner_block_h - 1) /
inner_block_h), sizeof(*result_regions)); inner_block_h), sizeof(*result_regions));
if (!result_regions) {
*n_region = 0;
return NULL;
}
k = 0; k = 0;
for (i = 0; i < *n_region; i++) { for (i = 0; i < *n_region; i++) {
x = box_array[clipped_regions[i].block_idx].x1; x = box_array[clipped_regions[i].block_idx].x1;
@ -368,6 +377,11 @@ _glamor_compute_clipped_regions(PixmapPtr pixmap,
DEBUGRegionPrint(region); DEBUGRegionPrint(region);
if (glamor_pixmap_priv_is_small(pixmap_priv)) { if (glamor_pixmap_priv_is_small(pixmap_priv)) {
clipped_regions = calloc(1, sizeof(*clipped_regions)); clipped_regions = calloc(1, sizeof(*clipped_regions));
if (!clipped_regions) {
*n_region = 0;
return NULL;
}
clipped_regions[0].region = RegionCreate(NULL, 1); clipped_regions[0].region = RegionCreate(NULL, 1);
clipped_regions[0].block_idx = 0; clipped_regions[0].block_idx = 0;
RegionCopy(clipped_regions[0].region, region); RegionCopy(clipped_regions[0].region, region);