summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2016-12-15 17:17:12 -0500
committerLibravatar Drew DeVault <sir@cmpwn.com>2016-12-15 19:01:40 -0500
commit8691ff1b63655c6fb11fd2ffe90770e7de707963 (patch)
tree9c12ea8dac4c33aad7bd649814e1adf5c302a11e
parentAlways log filename and line number (diff)
downloadsway-8691ff1b63655c6fb11fd2ffe90770e7de707963.tar.gz
sway-8691ff1b63655c6fb11fd2ffe90770e7de707963.tar.zst
sway-8691ff1b63655c6fb11fd2ffe90770e7de707963.zip
Handle border-related malloc failures
-rw-r--r--sway/border.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/sway/border.c b/sway/border.c
index c96ae6fe..5ae32d24 100644
--- a/sway/border.c
+++ b/sway/border.c
@@ -29,20 +29,24 @@ void border_clear(struct border *border) {
29static cairo_t *create_border_buffer(swayc_t *view, struct wlc_geometry g, cairo_surface_t **surface) { 29static cairo_t *create_border_buffer(swayc_t *view, struct wlc_geometry g, cairo_surface_t **surface) {
30 if (view->border == NULL) { 30 if (view->border == NULL) {
31 view->border = malloc(sizeof(struct border)); 31 view->border = malloc(sizeof(struct border));
32 if (!view->border) {
33 sway_log(L_ERROR, "Unable to allocate window border information");
34 return NULL;
35 }
32 } 36 }
33 cairo_t *cr; 37 cairo_t *cr;
34 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, g.size.w); 38 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, g.size.w);
35 view->border->buffer = calloc(stride * g.size.h, sizeof(unsigned char)); 39 view->border->buffer = calloc(stride * g.size.h, sizeof(unsigned char));
36 view->border->geometry = g; 40 view->border->geometry = g;
37 if (!view->border->buffer) { 41 if (!view->border->buffer) {
38 sway_log(L_DEBUG, "Unable to allocate buffer"); 42 sway_log(L_ERROR, "Unable to allocate window border buffer");
39 return NULL; 43 return NULL;
40 } 44 }
41 *surface = cairo_image_surface_create_for_data(view->border->buffer, 45 *surface = cairo_image_surface_create_for_data(view->border->buffer,
42 CAIRO_FORMAT_ARGB32, g.size.w, g.size.h, stride); 46 CAIRO_FORMAT_ARGB32, g.size.w, g.size.h, stride);
43 if (cairo_surface_status(*surface) != CAIRO_STATUS_SUCCESS) { 47 if (cairo_surface_status(*surface) != CAIRO_STATUS_SUCCESS) {
44 border_clear(view->border); 48 border_clear(view->border);
45 sway_log(L_DEBUG, "Unable to allocate surface"); 49 sway_log(L_ERROR, "Unable to allocate window border surface");
46 return NULL; 50 return NULL;
47 } 51 }
48 cr = cairo_create(*surface); 52 cr = cairo_create(*surface);
@@ -50,7 +54,7 @@ static cairo_t *create_border_buffer(swayc_t *view, struct wlc_geometry g, cairo
50 if (cairo_status(cr) != CAIRO_STATUS_SUCCESS) { 54 if (cairo_status(cr) != CAIRO_STATUS_SUCCESS) {
51 cairo_surface_destroy(*surface); 55 cairo_surface_destroy(*surface);
52 border_clear(view->border); 56 border_clear(view->border);
53 sway_log(L_DEBUG, "Unable to create cairo context"); 57 sway_log(L_ERROR, "Unable to create cairo context");
54 return NULL; 58 return NULL;
55 } 59 }
56 return cr; 60 return cr;
@@ -238,6 +242,10 @@ static char *generate_container_title(swayc_t *container) {
238 } 242 }
239 int len = 9; 243 int len = 9;
240 name = malloc(len * sizeof(char)); 244 name = malloc(len * sizeof(char));
245 if (!name) {
246 sway_log(L_ERROR, "Unable to allocate container title");
247 return NULL;
248 }
241 snprintf(name, len, "sway: %c[", layout); 249 snprintf(name, len, "sway: %c[", layout);
242 250
243 int i; 251 int i;
@@ -257,6 +265,11 @@ static char *generate_container_title(swayc_t *container) {
257 } 265 }
258 266
259 name = malloc(len * sizeof(char)); 267 name = malloc(len * sizeof(char));
268 if (!name) {
269 free(prev_name);
270 sway_log(L_ERROR, "Unable to allocate container title");
271 return NULL;
272 }
260 if (i < container->children->length-1) { 273 if (i < container->children->length-1) {
261 snprintf(name, len, "%s%s ", prev_name, title); 274 snprintf(name, len, "%s%s ", prev_name, title);
262 } else { 275 } else {
@@ -268,6 +281,11 @@ static char *generate_container_title(swayc_t *container) {
268 prev_name = name; 281 prev_name = name;
269 len = strlen(name) + 2; 282 len = strlen(name) + 2;
270 name = malloc(len * sizeof(char)); 283 name = malloc(len * sizeof(char));
284 if (!name) {
285 free(prev_name);
286 sway_log(L_ERROR, "Unable to allocate container title");
287 return NULL;
288 }
271 snprintf(name, len, "%s]", prev_name); 289 snprintf(name, len, "%s]", prev_name);
272 free(prev_name); 290 free(prev_name);
273 free(container->name); 291 free(container->name);
@@ -347,6 +365,9 @@ static void update_view_border(swayc_t *view) {
347 } 365 }
348 }; 366 };
349 cr = create_border_buffer(view, g, &surface); 367 cr = create_border_buffer(view, g, &surface);
368 if (!cr) {
369 goto cleanup;
370 }
350 371
351 bool render_top = !should_hide_top_border(view, view->y); 372 bool render_top = !should_hide_top_border(view, view->y);
352 if (view == focused || is_child_of_focused) { 373 if (view == focused || is_child_of_focused) {
@@ -408,6 +429,8 @@ static void update_view_border(swayc_t *view) {
408 } 429 }
409 } 430 }
410 431
432cleanup:
433
411 if (surface) { 434 if (surface) {
412 cairo_surface_flush(surface); 435 cairo_surface_flush(surface);
413 cairo_surface_destroy(surface); 436 cairo_surface_destroy(surface);