Blame elf/tst-dlopenfail.c

Packit Service 2d0921
/* Test dlopen rollback after failures involving NODELETE objects (bug 20839).
Packit Service 2d0921
   Copyright (C) 2019 Free Software Foundation, Inc.
Packit Service 2d0921
   This file is part of the GNU C Library.
Packit Service 2d0921
Packit Service 2d0921
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 2d0921
   modify it under the terms of the GNU Lesser General Public
Packit Service 2d0921
   License as published by the Free Software Foundation; either
Packit Service 2d0921
   version 2.1 of the License, or (at your option) any later version.
Packit Service 2d0921
Packit Service 2d0921
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 2d0921
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 2d0921
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 2d0921
   Lesser General Public License for more details.
Packit Service 2d0921
Packit Service 2d0921
   You should have received a copy of the GNU Lesser General Public
Packit Service 2d0921
   License along with the GNU C Library; if not, see
Packit Service 2d0921
   <https://www.gnu.org/licenses/>.  */
Packit Service 2d0921
Packit Service 2d0921
#include <dlfcn.h>
Packit Service 2d0921
#include <errno.h>
Packit Service 2d0921
#include <gnu/lib-names.h>
Packit Service 2d0921
#include <stddef.h>
Packit Service 2d0921
#include <stdio.h>
Packit Service 2d0921
#include <string.h>
Packit Service 2d0921
#include <support/check.h>
Packit Service 2d0921
#include <support/xdlfcn.h>
Packit Service 2d0921
Packit Service 2d0921
static int
Packit Service 2d0921
do_test (void)
Packit Service 2d0921
{
Packit Service 2d0921
  /* This test uses libpthread as the canonical NODELETE module.  If
Packit Service 2d0921
     libpthread is no longer NODELETE because it has been merged into
Packit Service 2d0921
     libc, the test needs to be updated.  */
Packit Service 2d0921
  TEST_VERIFY (dlsym (NULL, "pthread_create") == NULL);
Packit Service 2d0921
Packit Service 2d0921
  /* This is expected to fail because of the missing dependency.  */
Packit Service 2d0921
  puts ("info: attempting to load tst-dlopenfailmod1.so");
Packit Service 2d0921
  TEST_VERIFY (dlopen ("tst-dlopenfailmod1.so", RTLD_LAZY) == NULL);
Packit Service 2d0921
  const char *message = dlerror ();
Packit Service 2d0921
  TEST_COMPARE_STRING (message,
Packit Service 2d0921
                       "tst-dlopenfail-missingmod.so:"
Packit Service 2d0921
                       " cannot open shared object file:"
Packit Service 2d0921
                       " No such file or directory");
Packit Service 2d0921
Packit Service 2d0921
  /* Do not probe for the presence of libpthread at this point because
Packit Service 2d0921
     that might trigger relocation if bug 20839 is present, obscuring
Packit Service 2d0921
     a subsequent crash.  */
Packit Service 2d0921
Packit Service 2d0921
  /* This is expected to succeed.  */
Packit Service 2d0921
  puts ("info: loading tst-dlopenfailmod2.so");
Packit Service 2d0921
  void *handle = xdlopen ("tst-dlopenfailmod2.so", RTLD_NOW);
Packit Service 2d0921
  xdlclose (handle);
Packit Service 2d0921
Packit Service 2d0921
  /* libpthread should remain loaded.  */
Packit Service 2d0921
  TEST_VERIFY (dlopen (LIBPTHREAD_SO, RTLD_LAZY | RTLD_NOLOAD) != NULL);
Packit Service 2d0921
  TEST_VERIFY (dlsym (NULL, "pthread_create") == NULL);
Packit Service 2d0921
Packit Service 2d0921
  /* We can make libpthread global, and then the symbol should become
Packit Service 2d0921
     available.  */
Packit Service 2d0921
  TEST_VERIFY (dlopen (LIBPTHREAD_SO, RTLD_LAZY | RTLD_GLOBAL) != NULL);
Packit Service 2d0921
  TEST_VERIFY (dlsym (NULL, "pthread_create") != NULL);
Packit Service 2d0921
Packit Service 2d0921
  /* sem_open is sufficiently complex to depend on relocations.  */
Packit Service 2d0921
  void *(*sem_open_ptr) (const char *, int flag, ...)
Packit Service 2d0921
    = dlsym (NULL, "sem_open");
Packit Service 2d0921
  if (sem_open_ptr == NULL)
Packit Service 2d0921
    /* Hurd does not implement sem_open.  */
Packit Service 2d0921
    puts ("warning: sem_open not found, further testing not possible");
Packit Service 2d0921
  else
Packit Service 2d0921
    {
Packit Service 2d0921
      errno = 0;
Packit Service 2d0921
      TEST_VERIFY (sem_open_ptr ("/", 0) == NULL);
Packit Service 2d0921
      TEST_COMPARE (errno, EINVAL);
Packit Service 2d0921
    }
Packit Service 2d0921
Packit Service 2d0921
  return 0;
Packit Service 2d0921
}
Packit Service 2d0921
Packit Service 2d0921
#include <support/test-driver.c>