sysconf: Fix missing definition of UIO_MAXIOV on Linux [BZ #22321]

After commit 37f802f864 (Remove
__need_IOV_MAX and __need_FOPEN_MAX), UIO_MAXIOV is no longer supplied
(indirectly) through <bits/stdio_lim.h>, so sysdeps/posix/sysconf.c no
longer sees the definition.
This commit is contained in:
Florian Weimer 2017-10-20 04:10:15 +02:00
parent 95ccb619f5
commit 63b4baa44e
5 changed files with 82 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2017-10-20 Florian Weimer <fweimer@redhat.com>
[BZ #22321]
sysconf: Fix missing definition of UIO_MAXIOV on Linux.
* sysdeps/posix/sysconf.c: Include <sys/uio.h>.
* sysdeps/unix/sysv/linux/Makefile (tests): Add tst-sysconf-iov_max.
(tst-sysconf-iov_max): Link with tst-sysconf-iov_max-uapi.o.
* sysdeps/unix/sysv/linux/tst-sysconf-iov_max.c: New file.
* sysdeps/unix/sysv/linux/tst-sysconf-iov_max-uapi.c: Likewise.
2017-10-19 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/i386/fpu/libm-test-ulps: Regenerated.

View File

@ -29,6 +29,7 @@
#include <sys/stat.h>
#include <sys/sysinfo.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <regex.h>
#define NEED_SPEC_ARRAY 0

View File

@ -50,7 +50,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
bits/siginfo-arch.h bits/siginfo-consts-arch.h
tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
tst-quota tst-sync_file_range test-errno-linux
tst-quota tst-sync_file_range test-errno-linux tst-sysconf-iov_max
# Generate the list of SYS_* macros for the system calls (__NR_*
# macros). The file syscall-names.list contains all possible system
@ -95,6 +95,9 @@ $(objpfx)tst-syscall-list.out: \
$(objpfx)tst-syscall-list-sys.list
$(BASH) $^ $(AWK) > $@; $(evaluate-test)
# Separate object file for access to the constant from the UAPI header.
$(objpfx)tst-sysconf-iov_max: $(objpfx)tst-sysconf-iov_max-uapi.o
endif # $(subdir) == misc
ifeq ($(subdir),time)

View File

@ -0,0 +1,27 @@
/* Check IOV_MAX definition: Helper function to capture UAPI header value.
Copyright (C) 2017 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
<http://www.gnu.org/licenses/>. */
/* Use a separate function to avoid header compatibility issues. */
#include <linux/uio.h>
long
uio_maxiov_value (void)
{
return UIO_MAXIOV;
}

View File

@ -0,0 +1,40 @@
/* Check IOV_MAX definition for consistency (bug 22321).
Copyright (C) 2017 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
<http://www.gnu.org/licenses/>. */
/* Defined in tst-sysconf-iov_max-uapi.c. */
long uio_maxiov_value (void);
#include <limits.h>
#include <support/check.h>
#include <sys/uio.h>
#include <unistd.h>
static int
do_test (void)
{
TEST_VERIFY (_XOPEN_IOV_MAX == 16); /* Value required by POSIX. */
TEST_VERIFY (uio_maxiov_value () >= _XOPEN_IOV_MAX);
TEST_VERIFY (IOV_MAX == uio_maxiov_value ());
TEST_VERIFY (UIO_MAXIOV == uio_maxiov_value ());
TEST_VERIFY (sysconf (_SC_UIO_MAXIOV) == uio_maxiov_value ());
TEST_VERIFY (sysconf (_SC_IOV_MAX) == uio_maxiov_value ());
return 0;
}
#include <support/test-driver.c>