diff options
author | Drew DeVault <sir@cmpwn.com> | 2016-12-15 17:17:12 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2016-12-15 19:01:40 -0500 |
commit | 8691ff1b63655c6fb11fd2ffe90770e7de707963 (patch) | |
tree | 9c12ea8dac4c33aad7bd649814e1adf5c302a11e | |
parent | Always log filename and line number (diff) | |
download | sway-8691ff1b63655c6fb11fd2ffe90770e7de707963.tar.gz sway-8691ff1b63655c6fb11fd2ffe90770e7de707963.tar.zst sway-8691ff1b63655c6fb11fd2ffe90770e7de707963.zip |
Handle border-related malloc failures
-rw-r--r-- | sway/border.c | 29 |
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) { | |||
29 | static cairo_t *create_border_buffer(swayc_t *view, struct wlc_geometry g, cairo_surface_t **surface) { | 29 | static 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 | ||
432 | cleanup: | ||
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); |