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

After commit 37f802f86400684c8d13403958b2c598721d6360 (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.

(cherry picked from commit 63b4baa44e8d22501c433c4093aa3310f91b6aa2)
This commit is contained in:
Florian Weimer 2017-10-20 04:10:15 +02:00
parent 05155f0772
commit 2e78ea7a20
6 changed files with 85 additions and 2 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-11 Florian Weimer <fweimer@redhat.com>
[BZ #22078]

1
NEWS
View File

@ -38,6 +38,7 @@ The following bugs are resolved with this release:
[22146] Let fpclassify use the builtin when optimizing for size in C++ mode
[22225] math: nearbyint arithmetic moved before feholdexcept
[22235] Add C++ versions of iscanonical for ldbl-96 and ldbl-128ibm
[22321] sysconf: Fix missing definition of UIO_MAXIOV on Linux
Version 2.26

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).
@ -120,7 +120,11 @@ ifndef no_deps
-include $(objpfx)bits/syscall.d
endif
generated += bits/syscall.h bits/syscall.d
endif
# 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)
sysdep_headers += sys/timex.h bits/timex.h

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>