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

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