glibc/elf/tst-rtld-no-malloc.c
Florian Weimer c1560f3f75 elf: Switch to main malloc after final ld.so self-relocation
Before commit ee1ada1bdb
("elf: Rework exception handling in the dynamic loader
[BZ #25486]"), the previous order called the main calloc
to allocate a shadow GOT/PLT array for auditing support.
This happened before libc.so.6 ELF constructors were run, so
a user malloc could run without libc.so.6 having been
initialized fully.  One observable effect was that
environ was NULL at this point.

It does not seem to be possible at present to trigger such
an allocation, but it seems more robust to delay switching
to main malloc after ld.so self-relocation is complete.
The elf/tst-rtld-no-malloc-audit test case fails with a
2.34-era glibc that does not have this fix.

Reviewed-by: DJ Delorie <dj@redhat.com>
2024-11-06 10:33:44 +01:00

77 lines
1.7 KiB
C

/* Test that program loading does not call malloc.
Copyright (C) 2024 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C 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.
The GNU C 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 the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <string.h>
#include <unistd.h>
static void
print (const char *s)
{
const char *end = s + strlen (s);
while (s < end)
{
ssize_t ret = write (STDOUT_FILENO, s, end - s);
if (ret <= 0)
_exit (2);
s += ret;
}
}
static void __attribute__ ((noreturn))
unexpected_call (const char *function)
{
print ("error: unexpected call to ");
print (function);
print ("\n");
_exit (1);
}
/* These are the malloc functions implement in elf/dl-minimal.c. */
void
free (void *ignored)
{
unexpected_call ("free");
}
void *
calloc (size_t ignored1, size_t ignored2)
{
unexpected_call ("calloc");
}
void *
malloc (size_t ignored)
{
unexpected_call ("malloc");
}
void *
realloc (void *ignored1, size_t ignored2)
{
unexpected_call ("realloc");
}
int
main (void)
{
/* Do not use the test wrapper, to avoid spurious malloc calls from it. */
return 0;
}