Blame sysdeps/unix/sysv/linux/tst-ofdlocks.c

Packit Service 82fcde
/* Check non representable OFD locks regions in non-LFS mode (BZ #20251)
Packit Service 82fcde
   Copyright (C) 2018 Free Software Foundation, Inc.
Packit Service 82fcde
Packit Service 82fcde
   This program is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU General Public License
Packit Service 82fcde
   as published by the Free Software Foundation; either version 2
Packit Service 82fcde
   of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   This program is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 82fcde
   GNU General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU General Public License
Packit Service 82fcde
   along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service 82fcde
*/
Packit Service 82fcde
Packit Service 82fcde
#include <unistd.h>
Packit Service 82fcde
#include <fcntl.h>
Packit Service 82fcde
#include <stdint.h>
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
Packit Service 82fcde
#include <support/temp_file.h>
Packit Service 82fcde
#include <support/check.h>
Packit Service 82fcde
Packit Service 82fcde
static char *temp_filename;
Packit Service 82fcde
static int temp_fd;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
do_prepare (int argc, char **argv)
Packit Service 82fcde
{
Packit Service 82fcde
  temp_fd = create_temp_file ("tst-ofdlocks.", &temp_filename);
Packit Service 82fcde
  TEST_VERIFY_EXIT (temp_fd != -1);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define PREPARE do_prepare
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  /* It first allocates a open file description lock range which can not
Packit Service 82fcde
     be represented in a 32 bit struct flock.   */
Packit Service 82fcde
  struct flock64 lck64 = {
Packit Service 82fcde
    .l_type   = F_WRLCK,
Packit Service 82fcde
    .l_whence = SEEK_SET,
Packit Service 82fcde
    .l_start  = (off64_t)INT32_MAX + 1024,
Packit Service 82fcde
    .l_len    = 1024,
Packit Service 82fcde
  };
Packit Service 82fcde
  int ret = fcntl64 (temp_fd, F_OFD_SETLKW, &lck64);
Packit Service 82fcde
  if (ret == -1 && errno == EINVAL)
Packit Service 82fcde
    /* OFD locks are only available on Linux 3.15.  */
Packit Service 82fcde
    FAIL_UNSUPPORTED ("fcntl (F_OFD_SETLKW) not supported");
Packit Service 82fcde
Packit Service 82fcde
  TEST_VERIFY_EXIT (ret == 0);
Packit Service 82fcde
Packit Service 82fcde
  /* Open file description locks placed through the same open file description
Packit Service 82fcde
     (either by same file descriptor or a duplicated one created by fork,
Packit Service 82fcde
     dup, fcntl F_DUPFD, etc.) overwrites then old lock.  To force a
Packit Service 82fcde
     conflicting lock combination, it creates a new file descriptor.  */
Packit Service 82fcde
  int fd = open64 (temp_filename, O_RDWR, 0666);
Packit Service 82fcde
  TEST_VERIFY_EXIT (fd != -1);
Packit Service 82fcde
Packit Service 82fcde
  /* It tries then to allocate another open file descriptior with a valid
Packit Service 82fcde
     non-LFS bits struct flock but which will result in a conflicted region
Packit Service 82fcde
     which can not be represented in a non-LFS struct flock.  */
Packit Service 82fcde
  struct flock lck = {
Packit Service 82fcde
    .l_type   = F_WRLCK,
Packit Service 82fcde
    .l_whence = SEEK_SET,
Packit Service 82fcde
    .l_start  = INT32_MAX - 1024,
Packit Service 82fcde
    .l_len    = 4 * 1024,
Packit Service 82fcde
  };
Packit Service 82fcde
  int r = fcntl (fd, F_OFD_GETLK, &lck;;
Packit Service 82fcde
  if (sizeof (off_t) != sizeof (off64_t))
Packit Service 82fcde
    TEST_VERIFY (r == -1 && errno == EOVERFLOW);
Packit Service 82fcde
  else
Packit Service 82fcde
    TEST_VERIFY (r == 0);
Packit Service 82fcde
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#include <support/test-driver.c>