Instead of using a special ELF section along with a linker script
directive to put the IO vtables within the RELRO section, the libio
vtables are all moved to an array marked as data.relro (so linker
will place in the RELRO segment without the need of extra directives).
To avoid static linking namespace issues and including all vtable
referenced objects, all required function pointers are set to weak alias.
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
vfprintf is entangled with vfwprintf (of course), __printf_fp,
__printf_fphex, __vstrfmon_l_internal, and the strfrom family of
functions. The latter use the internal snprintf functionality,
so vsnprintf is converted as well.
The simples conversion is __printf_fphex, followed by
__vstrfmon_l_internal and __printf_fp, and finally
__vfprintf_internal and __vfwprintf_internal. __vsnprintf_internal
and strfrom* are mostly consuming the new interfaces, so they
are comparatively simple.
__printf_fp is a public symbol, so the FILE *-based interface
had to preserved.
The __printf_fp rewrite does not change the actual binary-to-decimal
conversion algorithm, and digits are still not emitted directly to
the target buffer. However, the staging buffer now uses bytes
instead of wide characters, and one buffer copy is eliminated.
The changes are at least performance-neutral in my testing.
Floating point printing and snprintf improved measurably, so that
this Lua script
for i=1,5000000 do
print(i, i * math.pi)
end
runs about 5% faster for me. To preserve fprintf performance for
a simple "%d" format, this commit has some logic changes under
LABEL (unsigned_number) to avoid additional function calls. There
are certainly some very easy performance improvements here: binary,
octal and hexadecimal formatting can easily avoid the temporary work
buffer (the number of digits can be computed ahead-of-time using one
of the __builtin_clz* built-ins). Decimal formatting can use a
specialized version of _itoa_word for base 10.
The existing (inconsistent) width handling between strfmon and printf
is preserved here. __print_fp_buffer_1 would have to use
__translated_number_width to achieve ISO conformance for printf.
Test expectations in libio/tst-vtables-common.c are adjusted because
the internal staging buffer merges all virtual function calls into
one.
In general, stack buffer usage is greatly reduced, particularly for
unbuffered input streams. __printf_fp can still use a large buffer
in binary128 mode for %g, though.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
I used these shell commands:
../glibc/scripts/update-copyrights $PWD/../gnulib/build-aux/update-copyright
(cd ../glibc && git commit -am"[this commit message]")
and then ignored the output, which consisted lines saying "FOO: warning:
copyright statement not found" for each of 7061 files FOO.
I then removed trailing white space from math/tgmath.h,
support/tst-support-open-dev-null-range.c, and
sysdeps/x86_64/multiarch/strlen-vec.S, to work around the following
obscure pre-commit check failure diagnostics from Savannah. I don't
know why I run into these diagnostics whereas others evidently do not.
remote: *** 912-#endif
remote: *** 913:
remote: *** 914-
remote: *** error: lines with trailing whitespace found
...
remote: *** error: sysdeps/unix/sysv/linux/statx_cp.c: trailing lines
I used these shell commands:
../glibc/scripts/update-copyrights $PWD/../gnulib/build-aux/update-copyright
(cd ../glibc && git commit -am"[this commit message]")
and then ignored the output, which consisted lines saying "FOO: warning:
copyright statement not found" for each of 6694 files FOO.
I then removed trailing white space from benchtests/bench-pthread-locks.c
and iconvdata/tst-iconv-big5-hkscs-to-2ucs4.c, to work around this
diagnostic from Savannah:
remote: *** pre-commit check failed ...
remote: *** error: lines with trailing whitespace found
remote: error: hook declined to update refs/heads/master
There are two flags currently defined: SCANF_LDBL_IS_DBL is the mode
used by __nldbl_ scanf variants, and SCANF_ISOC99_A is the mode used
by __isoc99_ scanf variants. In this patch, the new functions honor
these flag bits if they're set, but they still also look at the
corresponding bits of environmental state, and callers all pass zero.
The new functions do *not* have the "errp" argument possessed by
_IO_vfscanf and _IO_vfwscanf. All internal callers passed NULL for
that argument. External callers could theoretically exist, so I
preserved wrappers, but they are flagged as compat symbols and they
don't preserve the three-way distinction among types of errors that
was formerly exposed. These functions probably should have been in
the list of deprecated _IO_ symbols in 2.27 NEWS -- they're not just
aliases for vfscanf and vfwscanf.
(It was necessary to introduce ldbl_compat_symbol for _IO_vfscanf.
Please check that part of the patch very carefully, I am still not
confident I understand all of the details of ldbl-opt.)
This patch also introduces helper inlines in libio/strfile.h that
encapsulate the process of initializing an _IO_strfile object for
reading. This allows us to call __vfscanf_internal directly from
sscanf, and __vfwscanf_internal directly from swscanf, without
duplicating the initialization code. (Previously, they called their
v-counterparts, but that won't work if we want to control *both* C99
mode and ldbl-is-dbl mode using the flags argument to__vfscanf_internal.)
It's still a little awkward, especially for wide strfiles, but it's
much better than what we had.
Tested for powerpc and powerpc64le.
These unmangled function pointers reside on the heap and could
be targeted by exploit writers, effectively bypassing libio vtable
validation. Instead, we ignore these pointers and always call
malloc or free.
In theory, this is a backwards-incompatible change, but using the
global heap instead of the user-supplied callback functions should
have little application impact. (The old libstdc++ implementation
exposed this functionality via a public, undocumented constructor
in its strstreambuf class.)
This entirely mechanical (except for some indentation fixups) patch
replaces all uses of _IO_file_flags with _flags and removes the #define.
Installed stripped libraries and executables are unchanged by this patch.
* libio/libio.h (_IO_file_flags): Remove macro.
All uses changed to _flags.
This patch mechanically removes all remaining uses, and the
definitions, of the following libio name aliases:
name replaced with
---- -------------
_IO_FILE FILE
_IO_fpos_t __fpos_t
_IO_fpos64_t __fpos64_t
_IO_size_t size_t
_IO_ssize_t ssize_t or __ssize_t
_IO_off_t off_t
_IO_off64_t off64_t
_IO_pid_t pid_t
_IO_uid_t uid_t
_IO_wint_t wint_t
_IO_va_list va_list or __gnuc_va_list
_IO_BUFSIZ BUFSIZ
_IO_cookie_io_functions_t cookie_io_functions_t
__io_read_fn cookie_read_function_t
__io_write_fn cookie_write_function_t
__io_seek_fn cookie_seek_function_t
__io_close_fn cookie_close_function_t
I used __fpos_t and __fpos64_t instead of fpos_t and fpos64_t because
the definitions of fpos_t and fpos64_t depend on the largefile mode.
I used __ssize_t and __gnuc_va_list in a handful of headers where
namespace cleanliness might be relevant even though they're
internal-use-only. In all other cases, I used the public-namespace
name.
There are a tiny handful of places where I left a use of 'struct _IO_FILE'
alone, because it was being used together with 'struct _IO_FILE_plus'
or 'struct _IO_FILE_complete' in the same arithmetic expression.
Because this patch was almost entirely done with search and replace, I
may have introduced indentation botches. I did proofread the diff,
but I may have missed something.
The ChangeLog below calls out all of the places where this was not a
pure search-and-replace change.
Installed stripped libraries and executables are unchanged by this patch,
except that some assertions in vfscanf.c change line numbers.
* libio/libio.h (_IO_FILE): Delete; all uses changed to FILE.
(_IO_fpos_t): Delete; all uses changed to __fpos_t.
(_IO_fpos64_t): Delete; all uses changed to __fpos64_t.
(_IO_size_t): Delete; all uses changed to size_t.
(_IO_ssize_t): Delete; all uses changed to ssize_t or __ssize_t.
(_IO_off_t): Delete; all uses changed to off_t.
(_IO_off64_t): Delete; all uses changed to off64_t.
(_IO_pid_t): Delete; all uses changed to pid_t.
(_IO_uid_t): Delete; all uses changed to uid_t.
(_IO_wint_t): Delete; all uses changed to wint_t.
(_IO_va_list): Delete; all uses changed to va_list or __gnuc_va_list.
(_IO_BUFSIZ): Delete; all uses changed to BUFSIZ.
(_IO_cookie_io_functions_t): Delete; all uses changed to
cookie_io_functions_t.
(__io_read_fn): Delete; all uses changed to cookie_read_function_t.
(__io_write_fn): Delete; all uses changed to cookie_write_function_t.
(__io_seek_fn): Delete; all uses changed to cookie_seek_function_t.
(__io_close_fn): Delete: all uses changed to cookie_close_function_t.
* libio/iofopncook.c: Remove unnecessary forward declarations.
* libio/iolibio.h: Correct outdated commentary.
* malloc/malloc.c (__malloc_stats): Remove unnecessary casts.
* stdio-common/fxprintf.c (__fxprintf_nocancel):
Remove unnecessary casts.
* stdio-common/getline.c: Use _IO_getdelim directly.
Don't redefine ssize_t.
* stdio-common/printf_fp.c, stdio_common/printf_fphex.c
* stdio-common/printf_size.c: Don't redefine size_t or FILE.
Remove outdated comments.
* stdio-common/vfscanf.c: Don't redefine va_list.
libio.h was originally the header for a set of supported GNU
extensions, but they have not been maintained as such in many years,
they are now standing in the way of improvements to stdio, and we
don't think there are any remaining external users. _G_config.h was
never intended for public use, but predates the bits convention.
Move both of these headers into the bits directory and provide stubs
at top level which issue deprecation warnings.
The contents of (bits/)libio.h and (bits/)_G_config.h are still
exposed to external software via stdio.h; changing that requires more
complex surgery than I have time to attempt right now.
* libio/libio.h, libio/_G_config.h: New stub headers which issue a
deprecation warning and then include <bits/libio.h>, <bits/_G_config.h>
respectively.
* libio/libio.h: Rename the original version of this file to
libio/bits/libio.h. Error out if not included by stdio.h or the
stub libio.h.
* include/libio.h: Move to include/bits. Forward to libio/bits/libio.h.
* sysdeps/generic/_G_config.h: Move to top-level bits/. Error out
if not included by bits/libio.h or the stub _G_config.h.
* sysdeps/unix/sysv/linux/_G_config.h: Move to
sysdeps/unix/sysv/linux/bits. Error out if not included by
bits/libio.h or the stub _G_config.h.
* libio/stdio.h: Include bits/libio.h, not libio.h.
* libio/Makefile: Install bits/libio.h and bits/_G_config.h as
well as libio.h and _G_config.h.
* csu/init.c, libio/fmemopen.c, libio/iolibio.h, libio/oldfmemopen.c
* libio/strfile.h, stdio-common/vfscanf.c
* sysdeps/pthread/flockfile.c, sysdeps/pthread/funlockfile.c
Include stdio.h, not _G_config.h nor libio.h.
* libio/iofgetpos.c: Also rename fgetpos64 out of the way.
* libio/iofsetpos.c: Also rename fsetpos64 out of the way.
* scripts/check-installed-headers.sh: Skip libio.h and _G_config.h.
* include/bits/wchar2.h: New file.
* wcsmbs/wchar.h: Include <bits/wchar2.h> if fortification is
requested.
* wcsmbs/wcsncpy.c: Add __wcsncpy alias.
* string/bits/string3.h: Add fortified stpncpy definitions.
* sysdeps/generic/stpncpy_chk.c: New file.
* libio/vswprintf.c: Move _IO_wstrnfile definition to strfile.h.
Export _IO_wstrn_jumps.
* libio/strfile.h: Define _IO_wstrnfile and declare _IO_wstrn_jumps.
* include/wchar.h: Declare __wcsncpy and __vswprintf_chk.
* debug/fgetws_chk.c: New file.
* debug/fgetws_u_chk.c: New file.
* debug/fwprintf_chk.c: New file.
* debug/swprintf_chk.c: New file.
* debug/vfwprintf_chk.c: New file.
* debug/vswprintf_chk.c: New file.
* debug/vwprintf_chk.c: New file.
* debug/wcpcpy_chk.c: New file.
* debug/wcpncpy_chk.c: New file.
* debug/wcscat_chk.c: New file.
* debug/wcscpy_chk.c: New file.
* debug/wcsncat_chk.c: New file.
* debug/wcsncpy_chk.c: New file.
* debug/wmemcpy_chk.c: New file.
* debug/wmemmove_chk.c: New file.
* debug/wmempcpy_chk.c: New file.
* debug/wmemset_chk.c: New file.
* debug/wprintf_chk.c: New file.
* debug/tst-chk1.c: Add tests for new functions.
* debug/Versions: Export new functions.
* debug/Makefile (routines): Add new functions.
2001-07-06 Paul Eggert <eggert@twinsun.com>
* manual/argp.texi: Remove ignored LGPL copyright notice; it's
not appropriate for documentation anyway.
* manual/libc-texinfo.sh: "Library General Public License" ->
"Lesser General Public License".
2001-07-06 Andreas Jaeger <aj@suse.de>
* All files under GPL/LGPL version 2: Place under LGPL version
2.1.
1998-07-20 18:23 Ulrich Drepper <drepper@cygnus.com>
* libio/libioP.h: Use __PMT in typedef.
* libio/strfile.h: Likewise.
1998-07-20 18:20 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/gethostname.c: Return ENAMETOOLONG if
buffer is too small.
Reported by John Levon <j_levon@ncc.co.uk>.
Wed Nov 27 06:10:10 1996 Ulrich Drepper <drepper@cygnus.com>
* Makefile: Fix typo.
* configure: Require autoconf-2.11.
* elf/dl-deps.c: Terminate duplicate list.
* libio/libio.h: Add prototypes for _IO_seekoff and _IO_seekpos.
* libio/strfile.h: Update from current libg++.
* libio/strops.c: Likewise.
* login/Makefile (routines): Update after correction of reentrant
interface.
* login/endutent.c: Removed.
* login/endutent_r.c: Likewise.
* login/pututline.c: Likewise.
* login/pututline_r.c: Likewise.
* login/setutent.c: Likewise.
* login/setutent_r.c: Likewise.
* login/getutent.c: Update for new interface.
* login/getutent_r.c: Likewise.
* login/getutid.c: Likewise.
* login/getutid_r.c: Likewise.
* login/getutline.c: Likewise.
* login/getutline_r.c: Likewise.
* login/login.c: Likewise.
* login/logout.c: Likewise.
* login/logwtmp.c: Likewise.
* login/utmp.h: Likewise.
* sysdeps/unix/getlogin.c: Likewise.
* sysdeps/unix/getlogin_r.c: Likewise.
* login/utmp-private.h: New private header.
* login/utmp_db.c: Stub DB backend for utmp handler.
* login/utmp_file.c: File backend for utmp handler.
* sysdeps/gnu/utmpbits.h (struct utmp): Add some more fields.
(enum utlogin): List of record types.
(struct exit_status): Record to align with other implementations.
* sysdeps/generic/paths.h: Add _PATH_UTMP_DB.
* sysdeps/unix/sysv/linux/paths.h: Likewise.
* sysdeps/generic/pty.c: Use getgrnam_r instead of getgrnam.
* sysdeps/stub/getlogin.c: Update copyright.
* sysdeps/stub/getlogin_r.c: Likewise.
* nss/getXXbyYY_r.c: Use -1l for error-pointer value instead of -1.
* nss/getXXent_r.c: Likewise.
* nss/nsswitch.c: Likewise.
* posix/Makefile (headers): Add wait.h.
* posix/wait.h: New file.
* posix/sys/types.h: Always define intN_t types.
* stdio-common/Makefile: Update copyright.
Use -Wno-format flag for scanf4.c and scanf7.c.
* stdlib/stdlib.h: Reformat.
* time/africa: Update from ADO tzdata1996m.
* time/antarctica: Likewise.
* time/asia: Likewise.
* time/australia: Likewise.
* time/etcetera: Likewise.
* time/europe: Likewise.
* time/northamerica: Likewise.
* time/southamerica: Likewise.
* time/zone.tab: Likewise.
Fri Nov 22 19:34:12 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/posix/getcwd.c (__getcwd): After resizing the buffer
move the current contents to the end and relocate file name
pointer to upper half of the buffer.
Sun Nov 24 04:56:19 1996 Ulrich Drepper <drepper@cygnus.com>
* time/africa: Update from ADO tzdata1996m.
* time/antarctica: Likewise.
* time/asia: Likewise.
* time/australia: Likewise.
* time/etcetera: Likewise.
* time/europe: Likewise.
* time/nothamerica: Likewise.
* time/southameria: Likewise.
* time/zone.tab: Likewise.
* sysdeps/unix/sysv/linux/sys/serial.h: New file.
* sysdeps/unix/sysv/linux/Makefile [$(subdir)=misc] (sysdep_headers):
Add sys/serial.h.
* sysdeps/unix/sysv/linux/Dist: Add sys/serial.h.
* posix/wait.h: New file.
* posix/Makefile (headers): Add wait.h.
Sat Nov 23 17:27:52 1996 Roland McGrath <roland@gnu.ai.mit.edu>
* Makeconfig ($(common-objpfx)soversions.mk): Use regular
expression instead of shell pattern matching.
* shlib-versions: Change to regular expressions.
Sat Nov 23 13:24:55 1996 Ulrich Drepper <drepper@cygnus.com>
* io/stat.c: Add section from libgcc to copyright comment
to allow this file to be statically linked in applications.
* io/fstat.c: Likewise.
* io/lstat.c: Likewise.
* io/mknod.c: Likewise.
Fri Nov 22 15:14:23 1996 Ulrich Drepper <drepper@cygnus.com>
* csu/initfini.c: Add section from libgcc to copyright comment
to allow this file to be statically linked in applications.
* malloc/obstack.h [!_LIBC && !HAVE_STRING_H]: Define memcpy if
not already defined.
(obstack_grow, obstack_grow0): Correct placement of braces.
* gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Define to 2.
* malloc/obstack.c (OBSTACK_INTERFACE_VERSION): Define to 2.
Thu Nov 21 19:54:51 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makerules (make-link): Simplify by changing directory only if
not using rellns-sh; check whether we really have symbolic links.
* rellns-sh: Fix the case of $(dirname $2) being a prefix of
$(dirname $1); use status of ln for exit code; make more robust
against multiple slashes in a row.
Thu Nov 21 13:05:21 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* configure.in (after AC_CANONICAL_HOST): mutate *-*-gnu* names
into *-*-gnu-gnu*.
* shlib-versions (gnu versions): Recognize *-*-gnu-gnu* instead of
the three-part name, to distinguish correctly from *-*-linux-gnu*.
* sysdeps/mach/hurd/Makefile ($(libdir)/libc.so): Depend on
$(rpcuserlibs).
* sysdeps/mach/hurd/Makefile (install-others): Add
$(libdir)/libc_p.a.
($(libdir)/libc_p.a): New rule.
* sysdeps/mach/hurd/libc_p-ldscript: New file.
* sysdeps/mach/hurd/Dist: Add libc_p-ldscript.
Wed Nov 20 20:28:21 1996 Richard Henderson <rth@tamu.edu>
* Makerules (make-link): Use $(shell) to find rellns-sh before we cd.
* time/Makefile: Likewise.
* sysdeps/alpha/elf/Makefile: New file. Build crtbegin.o & crtend.o.
* sysdeps/alpha/elf/Dist: New file.
* sysdeps/alpha/elf/crtbegin.S, sysdeps/alpha/elf/crtend.S: New files.
The bits currently distributed with GCC fail in two ways -- they don't
understand multiple .got subsections and the extents of the lists are
dynamicly bound meaning that the application's lists get executed
multiple times and the library's lists never get executed.
Wed Nov 20 00:42:45 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* stdlib/strtod.c: Fix previous change.
Wed Nov 20 22:07:58 1996 Andreas Jaeger <aj@arthur.pfalz.de>
* time/Makefile ($(installed-localtime-file)): Use $(..) to find
rellns-sh script.
Wed Nov 20 12:50:54 1996 Ulrich Drepper <drepper@cygnus.com>
* stdio-common/Makefile: Add CFLAGS-scanf7.c to prevent warning.
Likesie for scanf4.c