blob: 479143723069ea7c29b904d8cf848d451b34b167 [file] [log] [blame]
/* 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 <http://www.gnu.org/licenses/>.
*
* Author: Marco Trevisan <marco.trevisan@canonical.com>
*/
#include "config.h"
#include <dlfcn.h>
#include <glib.h>
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[])
{
/* We expect this test to abort, so try to avoid that creating a coredump */
g_test_disable_crash_reporting ();
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;
}