src/buffer.c: prevent creating invalid buffers

Testcase: set title of foot to an invisible string (here LTR)

First one works and correctly sets the title, 2nd one crashes
- printf "\x1b]0;\xe2\x80\x8e%s\x07" "some title"
- printf "\x1b]0;\xe2\x80\x8e%s\x07" ""

Reported-by: Domo via IRC
This commit is contained in:
Consolatis 2026-06-11 18:01:11 +02:00
parent f4b9bdab65
commit 28d03b0893
3 changed files with 21 additions and 1 deletions

View file

@ -95,6 +95,7 @@ buffer_adopt_cairo_surface(cairo_surface_t *surface)
buffer->surface = surface; buffer->surface = surface;
buffer->data = cairo_image_surface_get_data(buffer->surface); buffer->data = cairo_image_surface_get_data(buffer->surface);
assert(buffer->data);
buffer->format = DRM_FORMAT_ARGB8888; buffer->format = DRM_FORMAT_ARGB8888;
buffer->stride = cairo_image_surface_get_stride(buffer->surface); buffer->stride = cairo_image_surface_get_stride(buffer->surface);
buffer->logical_width = width; buffer->logical_width = width;
@ -107,6 +108,12 @@ buffer_adopt_cairo_surface(cairo_surface_t *surface)
struct lab_data_buffer * struct lab_data_buffer *
buffer_create_cairo(uint32_t logical_width, uint32_t logical_height, float scale) buffer_create_cairo(uint32_t logical_width, uint32_t logical_height, float scale)
{ {
if (!logical_width || !logical_height) {
wlr_log(WLR_ERROR, "Failed to create cairo buffer of %ux%u: dimensions must be > 0",
logical_width, logical_height);
return NULL;
}
/* Create an image surface with the scaled size */ /* Create an image surface with the scaled size */
cairo_surface_t *surface = cairo_surface_t *surface =
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
@ -142,6 +149,7 @@ buffer_create_from_data(void *pixel_data, uint32_t width, uint32_t height,
buffer->logical_width = width; buffer->logical_width = width;
buffer->logical_height = height; buffer->logical_height = height;
buffer->data = pixel_data; buffer->data = pixel_data;
assert(buffer->data);
buffer->format = DRM_FORMAT_ARGB8888; buffer->format = DRM_FORMAT_ARGB8888;
buffer->stride = stride; buffer->stride = stride;
buffer->surface = cairo_image_surface_create_for_data( buffer->surface = cairo_image_surface_create_for_data(
@ -188,6 +196,10 @@ buffer_resize(struct lab_data_buffer *src_buffer, int width, int height,
struct lab_data_buffer *buffer = struct lab_data_buffer *buffer =
buffer_create_cairo(width, height, scale); buffer_create_cairo(width, height, scale);
if (!buffer) {
wlr_log(WLR_INFO, "Failed to resize buffer to %dx%d", width, height);
return NULL;
}
cairo_t *cairo = cairo_create(buffer->surface); cairo_t *cairo = cairo_create(buffer->surface);
struct wlr_box container = { struct wlr_box container = {

View file

@ -82,6 +82,7 @@ font_buffer_create(struct lab_data_buffer **buffer, int max_width,
cairo_pattern_t *bg_pattern, double scale, bool use_markup) cairo_pattern_t *bg_pattern, double scale, bool use_markup)
{ {
if (string_null_or_empty(text)) { if (string_null_or_empty(text)) {
*buffer = NULL;
return; return;
} }
@ -91,6 +92,13 @@ font_buffer_create(struct lab_data_buffer **buffer, int max_width,
height = computed_height; height = computed_height;
} }
if (height <= 0 || width <= 0) {
wlr_log(WLR_INFO, "Refusing to create invisible font buffer of %dx%d",
width, height);
*buffer = NULL;
return;
}
*buffer = buffer_create_cairo(width, height, scale); *buffer = buffer_create_cairo(width, height, scale);
if (!*buffer) { if (!*buffer) {
wlr_log(WLR_ERROR, "Failed to create font buffer"); wlr_log(WLR_ERROR, "Failed to create font buffer");

View file

@ -29,7 +29,7 @@ _create_buffer(struct scaled_buffer *scaled_buffer, double scale)
&self->font, self->color, bg_pattern, scale, self->use_markup); &self->font, self->color, bg_pattern, scale, self->use_markup);
if (!buffer) { if (!buffer) {
wlr_log(WLR_ERROR, "font_buffer_create() failed"); wlr_log(WLR_INFO, "font_buffer_create() failed");
} }
zfree_pattern(solid_bg_pattern); zfree_pattern(solid_bg_pattern);