1 /* Check that dlfcn errors are reported properly after dlmopen. 2 Copyright (C) 2021-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <http://www.gnu.org/licenses/>. */ 18 19 #include <stddef.h> 20 #include <string.h> 21 #include <support/check.h> 22 #include <support/xdlfcn.h> 23 24 static int do_test(void)25do_test (void) 26 { 27 void *handle = xdlmopen (LM_ID_NEWLM, "tst-dlmopen-dlerror-mod.so", 28 RTLD_NOW); 29 void (*call_dlsym) (const char *name) = xdlsym (handle, "call_dlsym"); 30 void (*call_dlopen) (const char *name) = xdlsym (handle, "call_dlopen"); 31 32 /* Iterate over various name lengths. This changes the size of 33 error messages allocated by ld.so and has been shown to trigger 34 detectable heap corruption if malloc/free calls in different 35 namespaces are mixed. */ 36 char buffer[2048]; 37 char *buffer_end = &buffer[sizeof (buffer) - 2]; 38 for (char *p = stpcpy (buffer, "does not exist "); p < buffer_end; ++p) 39 { 40 p[0] = 'X'; 41 p[1] = '\0'; 42 call_dlsym (buffer); 43 call_dlopen (buffer); 44 } 45 46 return 0; 47 } 48 49 #include <support/test-driver.c> 50