# Copyright (C) 2002-2004, 2006-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Test whether the *printf family of functions recovers gracefully in case # of an out-of-memory condition, or whether it crashes the entire program. # Result is gl_cv_func_printf_enomem. printf_enomem_test = ''' #include #include #include #include #include int main() { struct rlimit limit; int ret; nocrash_init (); /* Some printf implementations allocate temporary space with malloc. */ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */ #ifdef RLIMIT_DATA if (getrlimit (RLIMIT_DATA, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_DATA, &limit) < 0) return 77; #endif /* On Linux systems, malloc() is limited by RLIMIT_AS. */ #ifdef RLIMIT_AS if (getrlimit (RLIMIT_AS, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_AS, &limit) < 0) return 77; #endif /* Some printf implementations allocate temporary space on the stack. */ #ifdef RLIMIT_STACK if (getrlimit (RLIMIT_STACK, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_STACK, &limit) < 0) return 77; #endif ret = printf ("%.5000000f", 1.0); return !(ret == 5000002 || (ret < 0 && errno == ENOMEM)); } ''' if not meson.is_cross_build() or meson.has_exe_wrapper() run_result = cc.run(printf_enomem_test, name : 'printf survives out-of-memory conditions') gl_cv_func_printf_enomem = run_result.compiled() and run_result.returncode() == 0 else # If we don't know, assume the worst. gl_cv_func_printf_enomem = false if (host_system == 'linux' or host_system == 'solaris' or host_system == 'sunos' or host_system == 'aix' or host_system == 'irix' or host_system == 'beos' or host_system == 'haiku') gl_cv_func_printf_enomem = true endif endif