Blame elf/tst-ldconfig-bad-aux-cache.c

Packit Service fe03a9
/* Test ldconfig does not segfault when aux-cache is corrupted (Bug 18093).
Packit Service fe03a9
   Copyright (C) 2019 Free Software Foundation, Inc.
Packit Service fe03a9
   This file is part of the GNU C Library.
Packit Service fe03a9
Packit Service fe03a9
   The GNU C Library is free software; you can redistribute it and/or
Packit Service fe03a9
   modify it under the terms of the GNU Lesser General Public License as
Packit Service fe03a9
   published by the Free Software Foundation; either version 2.1 of the
Packit Service fe03a9
   License, or (at your option) any later version.
Packit Service fe03a9
Packit Service fe03a9
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service fe03a9
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fe03a9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fe03a9
   Lesser General Public License for more details.
Packit Service fe03a9
Packit Service fe03a9
   You should have received a copy of the GNU Lesser General Public
Packit Service fe03a9
   License along with the GNU C Library; see the file COPYING.LIB.  If
Packit Service fe03a9
   not, see <http://www.gnu.org/licenses/>.  */
Packit Service fe03a9
Packit Service fe03a9
/* This test does the following:
Packit Service fe03a9
   Run ldconfig to create the caches.
Packit Service fe03a9
   Corrupt the caches.
Packit Service fe03a9
   Run ldconfig again.
Packit Service fe03a9
   At each step we verify that ldconfig does not crash.  */
Packit Service fe03a9
Packit Service fe03a9
#include <stdio.h>
Packit Service fe03a9
#include <stdlib.h>
Packit Service fe03a9
#include <string.h>
Packit Service fe03a9
#include <unistd.h>
Packit Service fe03a9
#include <errno.h>
Packit Service fe03a9
#include <sys/wait.h>
Packit Service fe03a9
#include <ftw.h>
Packit Service fe03a9
#include <stdint.h>
Packit Service fe03a9
Packit Service a3de24
#include <support/capture_subprocess.h>
Packit Service fe03a9
#include <support/check.h>
Packit Service fe03a9
#include <support/support.h>
Packit Service fe03a9
#include <support/xunistd.h>
Packit Service fe03a9
Packit Service fe03a9
#include <dirent.h>
Packit Service fe03a9
Packit Service fe03a9
static int
Packit Service fe03a9
display_info (const char *fpath, const struct stat *sb,
Packit Service fe03a9
              int tflag, struct FTW *ftwbuf)
Packit Service fe03a9
{
Packit Service fe03a9
  printf ("info: %-3s %2d %7jd   %-40s %d %s\n",
Packit Service fe03a9
          (tflag == FTW_D) ? "d" : (tflag == FTW_DNR) ? "dnr" :
Packit Service fe03a9
          (tflag == FTW_DP) ? "dp" : (tflag == FTW_F) ? "f" :
Packit Service fe03a9
          (tflag == FTW_NS) ? "ns" : (tflag == FTW_SL) ? "sl" :
Packit Service fe03a9
          (tflag == FTW_SLN) ? "sln" : "???",
Packit Service fe03a9
          ftwbuf->level, (intmax_t) sb->st_size,
Packit Service fe03a9
          fpath, ftwbuf->base, fpath + ftwbuf->base);
Packit Service fe03a9
  /* To tell nftw to continue.  */
Packit Service fe03a9
  return 0;
Packit Service fe03a9
}
Packit Service fe03a9
Packit Service a3de24
static void
Packit Service a3de24
execv_wrapper (void *args)
Packit Service a3de24
{
Packit Service a3de24
  char **argv = args;
Packit Service a3de24
Packit Service a3de24
  execv (argv[0], argv);
Packit Service a3de24
  FAIL_EXIT1 ("execv: %m");
Packit Service a3de24
}
Packit Service a3de24
Packit Service fe03a9
/* Run ldconfig with a corrupt aux-cache, in particular we test for size
Packit Service fe03a9
   truncation that might happen if a previous ldconfig run failed or if
Packit Service fe03a9
   there were storage or power issues while we were writing the file.
Packit Service fe03a9
   We want ldconfig not to crash, and it should be able to do so by
Packit Service fe03a9
   computing the expected size of the file (bug 18093).  */
Packit Service fe03a9
static int
Packit Service fe03a9
do_test (void)
Packit Service fe03a9
{
Packit Service fe03a9
  char *prog = xasprintf ("%s/ldconfig", support_install_rootsbindir);
Packit Service a3de24
  char *args[] = { prog, NULL };
Packit Service fe03a9
  const char *path = "/var/cache/ldconfig/aux-cache";
Packit Service fe03a9
  struct stat64 fs;
Packit Service fe03a9
  long int size, new_size, i;
Packit Service fe03a9
Packit Service fe03a9
  /* Create the needed directories. */
Packit Service fe03a9
  xmkdirp ("/var/cache/ldconfig", 0777);
Packit Service fe03a9
Packit Service a3de24
  /* Run ldconfig first to generate the aux-cache.  */
Packit Service a3de24
  struct support_capture_subprocess result;
Packit Service a3de24
  result = support_capture_subprocess (execv_wrapper, args);
Packit Service a3de24
  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
Packit Service a3de24
  support_capture_subprocess_free (&result);
Packit Service a3de24
Packit Service a3de24
  xstat (path, &fs);
Packit Service a3de24
Packit Service a3de24
  size = fs.st_size;
Packit Service a3de24
  /* Run 3 tests, each truncating aux-cache shorter and shorter.  */
Packit Service a3de24
  for (i = 3; i > 0; i--)
Packit Service fe03a9
    {
Packit Service a3de24
      new_size = size * i / 4;
Packit Service a3de24
      if (truncate (path, new_size))
Packit Service a3de24
        FAIL_EXIT1 ("truncation failed: %m");
Packit Service a3de24
      if (nftw (path, display_info, 1000, 0) == -1)
Packit Service a3de24
        FAIL_EXIT1 ("nftw failed.");
Packit Service a3de24
Packit Service a3de24
      /* Verify that ldconfig can run with a truncated
Packit Service a3de24
         aux-cache and doesn't crash.  */
Packit Service a3de24
      struct support_capture_subprocess result;
Packit Service a3de24
      result = support_capture_subprocess (execv_wrapper, args);
Packit Service a3de24
      support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
Packit Service a3de24
      support_capture_subprocess_free (&result);
Packit Service fe03a9
    }
Packit Service fe03a9
Packit Service fe03a9
  free (prog);
Packit Service fe03a9
  return 0;
Packit Service fe03a9
}
Packit Service fe03a9
Packit Service fe03a9
#include <support/test-driver.c>