/* Unit tests for gmessages on low-memory * * Copyright (C) 2022 Marco Trevisan * * SPDX-License-Identifier: LGPL-2.1-or-later * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, see . * * Author: Marco Trevisan */ #include "config.h" #include #include static gboolean malloc_eom = FALSE; static gboolean our_malloc_called = FALSE; #ifdef ENOMEM /* Wrapper around malloc() which returns `ENOMEM` if the test variable * `malloc_eom` is set. * Otherwise passes through to the normal malloc() in libc. */ void * malloc (size_t size) { static void *(*real_malloc)(size_t); if (!real_malloc) real_malloc = dlsym (RTLD_NEXT, "malloc"); if (malloc_eom) { our_malloc_called = TRUE; errno = ENOMEM; return NULL; } return real_malloc (size); } #endif int main (int argc, char *argv[]) { g_setenv ("LC_ALL", "C", TRUE); #ifndef ENOMEM g_message ("ENOMEM Not defined, test skipped"); return 77; #endif g_message ("Simulates a situation in which we were crashing because " "of low-memory, leading malloc to fail instead of aborting"); g_message ("bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2753"); /* Setting `malloc_eom` to true should cause the override `malloc()` * in this file to fail on the allocation on the next line. */ malloc_eom = TRUE; g_message ("Memory is exhausted, but we'll write anyway: %u", 123); #ifndef __linux__ if (!our_malloc_called) { /* For some reasons this doesn't work darwin systems, so ignore the result * for non-linux, while we want to ensure the test is valid at least there */ g_message ("Our malloc implementation has not been called, the test " "has not been performed"); return 77; } #endif return 0; }