From 9229a45116e6c33930c5f5de79d5a4790ae84642 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Wed, 20 Jul 2022 12:29:56 +0300 Subject: [PATCH] shared: rewrite fail_on_null() as abort_oom_if_null() Recently I learnt that fprintf() is not async-signal-safe. Maybe it also attempts to allocate memory sometimes. Hence, using it when we presumably are out of memory is wishful thinking. Therefore replace that with async-signal-safe code. If you have to check pointers from traditional signal handlers, now you could do that too! While doing this, we also lose the string formatting for line number. I would argue that printing file and line number is not that useful, if the system really is out of memory. If not out of memory, a core dump would give us much more detailed information about what went wrong. clients/window.c had some calls to fail_on_null() and these are simply replaced. They were used for checking that creating new wl_proxy by issuing a protocol request worked, and IIRC that only fails on out-of-memory, so the same rationale applies here. Signed-off-by: Pekka Paalanen --- clients/window.c | 12 ++++++------ shared/xalloc.h | 36 +++++++++++++++++------------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/clients/window.c b/clients/window.c index 52713488..8073fbc6 100644 --- a/clients/window.c +++ b/clients/window.c @@ -5081,14 +5081,14 @@ window_create(struct display *display) window->xdg_surface = xdg_wm_base_get_xdg_surface(window->display->xdg_shell, window->main_surface->surface); - fail_on_null(window->xdg_surface, 0, __FILE__, __LINE__); + abort_oom_if_null(window->xdg_surface); xdg_surface_add_listener(window->xdg_surface, &xdg_surface_listener, window); window->xdg_toplevel = xdg_surface_get_toplevel(window->xdg_surface); - fail_on_null(window->xdg_toplevel, 0, __FILE__, __LINE__); + abort_oom_if_null(window->xdg_toplevel); xdg_toplevel_add_listener(window->xdg_toplevel, &xdg_toplevel_listener, window); @@ -5293,7 +5293,7 @@ create_menu(struct display *display, menu->widget = window_add_widget(menu->window, menu); menu->frame = frame_create(window->display->theme, 0, 0, FRAME_BUTTON_NONE, NULL, NULL); - fail_on_null(menu->frame, 0, __FILE__, __LINE__); + abort_oom_if_null(menu->frame); menu->entries = entries; menu->count = count; menu->release_count = 0; @@ -5327,7 +5327,7 @@ create_simple_positioner(struct display *display, struct xdg_positioner *positioner; positioner = xdg_wm_base_create_positioner(display->xdg_shell); - fail_on_null(positioner, 0, __FILE__, __LINE__); + abort_oom_if_null(positioner); xdg_positioner_set_anchor_rect(positioner, x, y, 1, 1); xdg_positioner_set_size(positioner, w, h); xdg_positioner_set_anchor(positioner, @@ -5372,7 +5372,7 @@ window_show_menu(struct display *display, window->xdg_surface = xdg_wm_base_get_xdg_surface(display->xdg_shell, window->main_surface->surface); - fail_on_null(window->xdg_surface, 0, __FILE__, __LINE__); + abort_oom_if_null(window->xdg_surface); xdg_surface_add_listener(window->xdg_surface, &xdg_surface_listener, window); @@ -5385,7 +5385,7 @@ window_show_menu(struct display *display, window->xdg_popup = xdg_surface_get_popup(window->xdg_surface, parent->xdg_surface, positioner); - fail_on_null(window->xdg_popup, 0, __FILE__, __LINE__); + abort_oom_if_null(window->xdg_popup); xdg_positioner_destroy(positioner); xdg_popup_grab(window->xdg_popup, input->seat, display_get_serial(window->display)); diff --git a/shared/xalloc.h b/shared/xalloc.h index 86647d34..f73c2315 100644 --- a/shared/xalloc.h +++ b/shared/xalloc.h @@ -1,5 +1,6 @@ /* * Copyright © 2008 Kristian Høgsberg + * Copyright 2022 Collabora, Ltd. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -31,35 +32,32 @@ extern "C" { #endif #include -#include #include +#include #include #include - static inline void * -fail_on_null(void *p, size_t size, char *file, int32_t line) +abort_oom_if_null(void *p) { - if (p == NULL) { - fprintf(stderr, "[%s] ", program_invocation_short_name); - if (file) - fprintf(stderr, "%s:%d: ", file, line); - fprintf(stderr, "out of memory"); - if (size) - fprintf(stderr, " (%zd)", size); - fprintf(stderr, "\n"); - exit(EXIT_FAILURE); - } + static const char oommsg[] = ": out of memory\n"; - return p; + if (p) + return p; + + write(STDERR_FILENO, program_invocation_short_name, + strlen(program_invocation_short_name)); + write(STDERR_FILENO, oommsg, strlen(oommsg)); + + abort(); } -#define xmalloc(s) (fail_on_null(malloc(s), (s), __FILE__, __LINE__)) -#define xzalloc(s) (fail_on_null(zalloc(s), (s), __FILE__, __LINE__)) -#define xcalloc(n, s) (fail_on_null(calloc(n, s), (n) * (s), __FILE__, __LINE__)) -#define xstrdup(s) (fail_on_null(strdup(s), 0, __FILE__, __LINE__)) -#define xrealloc(p, s) (fail_on_null(realloc(p, s), (s), __FILE__, __LINE__)) +#define xmalloc(s) (abort_oom_if_null(malloc(s))) +#define xzalloc(s) (abort_oom_if_null(zalloc(s))) +#define xcalloc(n, s) (abort_oom_if_null(calloc(n, s))) +#define xstrdup(s) (abort_oom_if_null(strdup(s))) +#define xrealloc(p, s) (abort_oom_if_null(realloc(p, s))) #ifdef __cplusplus }