diff --git a/src/buffer.c b/src/buffer.c index 04ca4328..a9fa717e 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -95,6 +95,7 @@ buffer_adopt_cairo_surface(cairo_surface_t *surface) buffer->surface = surface; buffer->data = cairo_image_surface_get_data(buffer->surface); + assert(buffer->data); buffer->format = DRM_FORMAT_ARGB8888; buffer->stride = cairo_image_surface_get_stride(buffer->surface); buffer->logical_width = width; @@ -107,6 +108,12 @@ buffer_adopt_cairo_surface(cairo_surface_t *surface) struct lab_data_buffer * 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 */ cairo_surface_t *surface = 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_height = height; buffer->data = pixel_data; + assert(buffer->data); buffer->format = DRM_FORMAT_ARGB8888; buffer->stride = stride; 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 = 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); struct wlr_box container = { diff --git a/src/common/font.c b/src/common/font.c index 5162d284..642f864d 100644 --- a/src/common/font.c +++ b/src/common/font.c @@ -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) { if (string_null_or_empty(text)) { + *buffer = NULL; return; } @@ -91,6 +92,13 @@ font_buffer_create(struct lab_data_buffer **buffer, int max_width, 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); if (!*buffer) { wlr_log(WLR_ERROR, "Failed to create font buffer"); diff --git a/src/scaled-buffer/scaled-font-buffer.c b/src/scaled-buffer/scaled-font-buffer.c index c748c00c..b85a79ff 100644 --- a/src/scaled-buffer/scaled-font-buffer.c +++ b/src/scaled-buffer/scaled-font-buffer.c @@ -29,7 +29,7 @@ _create_buffer(struct scaled_buffer *scaled_buffer, double scale) &self->font, self->color, bg_pattern, scale, self->use_markup); if (!buffer) { - wlr_log(WLR_ERROR, "font_buffer_create() failed"); + wlr_log(WLR_INFO, "font_buffer_create() failed"); } zfree_pattern(solid_bg_pattern);