mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-04-23 07:39:17 +02:00
We're already repeating this in 4 places, and in a subsequent commit I'll extend it to do more. Signed-off-by: Simon McVittie <smcv@collabora.com>
92 lines
2.5 KiB
C
92 lines
2.5 KiB
C
/* 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;
|
|
}
|