mirror of
https://sourceware.org/git/glibc.git
synced 2024-09-19 16:10:01 +00:00
* stdio-common/Makefile (aux): Add fxprintf.
* stdio-common/fxprintf.c: New file. * include/stdio.h: Add declaration for stdio.h. * argp/argp-fmtstream.c: Use __fxprintf instead of inline stream orientation test and two separate function calls. * argp/argp-help.c: Likewise. * assert/assert-perr.c: Likewise. * assert/assert.c: Likewise. * gmon/gmon.c: Likewise. * inet/rcmd.c: Likewise. * malloc/obstack.c: Likewise. * misc/error.c: Likewise. * misc/getpass.c: Likewise. * posix/getopt.c: Likewise. * resolv/res_hconf.c: Likewise. * stdio-common/perror.c: Likewise. * stdio-common/psignal.c: Likewise. * stdlib/fmtmsg.c: Likewise. * sunrpc/auth_unix.c: Likewise. * sunrpc/clnt_perr.c: Likewise. * sunrpc/clnt_tcp.c: Likewise. * sunrpc/clnt_udp.c: Likewise. * sunrpc/clnt_unix.c: Likewise. * sunrpc/svc_simple.c: Likewise. * sunrpc/svc_tcp.c: Likewise. * sunrpc/svc_udp.c: Likewise. * sunrpc/svc_unix.c: Likewise. * sunrpc/xdr.c: Likewise. * sunrpc/xdr_array.c: Likewise. * sunrpc/xdr_rec.c: Likewise. * sunrpc/xdr_ref.c: Likewise. * sysdeps/generic/wordexp.c: Likewise. * misc/Makefile: Add rules to build and run tst-error1. * misc/tst-error1.c: New file. * misc/error.c: Fix memory leak and possibly endless loop.
This commit is contained in:
parent
401a9ec9ca
commit
10ffcd52f0
37
ChangeLog
37
ChangeLog
@ -1,5 +1,42 @@
|
|||||||
2005-07-19 Ulrich Drepper <drepper@redhat.com>
|
2005-07-19 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* stdio-common/Makefile (aux): Add fxprintf.
|
||||||
|
* stdio-common/fxprintf.c: New file.
|
||||||
|
* include/stdio.h: Add declaration for stdio.h.
|
||||||
|
* argp/argp-fmtstream.c: Use __fxprintf instead of inline stream
|
||||||
|
orientation test and two separate function calls.
|
||||||
|
* argp/argp-help.c: Likewise.
|
||||||
|
* assert/assert-perr.c: Likewise.
|
||||||
|
* assert/assert.c: Likewise.
|
||||||
|
* gmon/gmon.c: Likewise.
|
||||||
|
* inet/rcmd.c: Likewise.
|
||||||
|
* malloc/obstack.c: Likewise.
|
||||||
|
* misc/error.c: Likewise.
|
||||||
|
* misc/getpass.c: Likewise.
|
||||||
|
* posix/getopt.c: Likewise.
|
||||||
|
* resolv/res_hconf.c: Likewise.
|
||||||
|
* stdio-common/perror.c: Likewise.
|
||||||
|
* stdio-common/psignal.c: Likewise.
|
||||||
|
* stdlib/fmtmsg.c: Likewise.
|
||||||
|
* sunrpc/auth_unix.c: Likewise.
|
||||||
|
* sunrpc/clnt_perr.c: Likewise.
|
||||||
|
* sunrpc/clnt_tcp.c: Likewise.
|
||||||
|
* sunrpc/clnt_udp.c: Likewise.
|
||||||
|
* sunrpc/clnt_unix.c: Likewise.
|
||||||
|
* sunrpc/svc_simple.c: Likewise.
|
||||||
|
* sunrpc/svc_tcp.c: Likewise.
|
||||||
|
* sunrpc/svc_udp.c: Likewise.
|
||||||
|
* sunrpc/svc_unix.c: Likewise.
|
||||||
|
* sunrpc/xdr.c: Likewise.
|
||||||
|
* sunrpc/xdr_array.c: Likewise.
|
||||||
|
* sunrpc/xdr_rec.c: Likewise.
|
||||||
|
* sunrpc/xdr_ref.c: Likewise.
|
||||||
|
* sysdeps/generic/wordexp.c: Likewise.
|
||||||
|
|
||||||
|
* misc/Makefile: Add rules to build and run tst-error1.
|
||||||
|
* misc/tst-error1.c: New file.
|
||||||
|
* misc/error.c: Fix memory leak and possibly endless loop.
|
||||||
|
|
||||||
* configure.in: Check for -fstack-protector gcc option.
|
* configure.in: Check for -fstack-protector gcc option.
|
||||||
* config.make.in (have-ssp): Add template.
|
* config.make.in (have-ssp): Add template.
|
||||||
* nscd/Makefile (nscd-cflags): Add -fstack-protector if supported.
|
* nscd/Makefile (nscd-cflags): Add -fstack-protector if supported.
|
||||||
|
30
configure
vendored
30
configure
vendored
@ -313,7 +313,7 @@ ac_includes_default="\
|
|||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif"
|
#endif"
|
||||||
|
|
||||||
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie fno_unit_at_a_time libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
|
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
|
||||||
ac_subst_files=''
|
ac_subst_files=''
|
||||||
|
|
||||||
# Initialize some variables set by options.
|
# Initialize some variables set by options.
|
||||||
@ -5799,6 +5799,33 @@ if test $libc_cv_fno_unit_at_a_time = yes; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo "$as_me:$LINENO: checking for -fstack-protector" >&5
|
||||||
|
echo $ECHO_N "checking for -fstack-protector... $ECHO_C" >&6
|
||||||
|
if test "${libc_cv_ssp+set}" = set; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
cat > conftest.c <<EOF
|
||||||
|
int foo;
|
||||||
|
main () { return 0;}
|
||||||
|
EOF
|
||||||
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fstack-protector
|
||||||
|
-o conftest conftest.c 1>&5'
|
||||||
|
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; }
|
||||||
|
then
|
||||||
|
libc_cv_ssp=yes
|
||||||
|
else
|
||||||
|
libc_cv_ssp=no
|
||||||
|
fi
|
||||||
|
rm -f conftest*
|
||||||
|
fi
|
||||||
|
echo "$as_me:$LINENO: result: $libc_cv_ssp" >&5
|
||||||
|
echo "${ECHO_T}$libc_cv_ssp" >&6
|
||||||
|
|
||||||
|
|
||||||
if test $elf != yes; then
|
if test $elf != yes; then
|
||||||
echo "$as_me:$LINENO: checking for .init and .fini sections" >&5
|
echo "$as_me:$LINENO: checking for .init and .fini sections" >&5
|
||||||
echo $ECHO_N "checking for .init and .fini sections... $ECHO_C" >&6
|
echo $ECHO_N "checking for .init and .fini sections... $ECHO_C" >&6
|
||||||
@ -8434,6 +8461,7 @@ s,@libc_cv_z_combreloc@,$libc_cv_z_combreloc,;t t
|
|||||||
s,@libc_cv_z_execstack@,$libc_cv_z_execstack,;t t
|
s,@libc_cv_z_execstack@,$libc_cv_z_execstack,;t t
|
||||||
s,@libc_cv_fpie@,$libc_cv_fpie,;t t
|
s,@libc_cv_fpie@,$libc_cv_fpie,;t t
|
||||||
s,@fno_unit_at_a_time@,$fno_unit_at_a_time,;t t
|
s,@fno_unit_at_a_time@,$fno_unit_at_a_time,;t t
|
||||||
|
s,@libc_cv_ssp@,$libc_cv_ssp,;t t
|
||||||
s,@libc_cv_have_initfini@,$libc_cv_have_initfini,;t t
|
s,@libc_cv_have_initfini@,$libc_cv_have_initfini,;t t
|
||||||
s,@no_whole_archive@,$no_whole_archive,;t t
|
s,@no_whole_archive@,$no_whole_archive,;t t
|
||||||
s,@exceptions@,$exceptions,;t t
|
s,@exceptions@,$exceptions,;t t
|
||||||
|
@ -79,6 +79,8 @@ extern int __ftrylockfile (FILE *__stream);
|
|||||||
extern int __getc_unlocked (FILE *__fp);
|
extern int __getc_unlocked (FILE *__fp);
|
||||||
extern wint_t __getwc_unlocked (FILE *__fp);
|
extern wint_t __getwc_unlocked (FILE *__fp);
|
||||||
|
|
||||||
|
extern int __fxprintf (FILE *__fp, const char *__fmt, const wchar_t *__wfmt,
|
||||||
|
...) __attribute__ ((__format__ (__printf__, 2, 4)));
|
||||||
|
|
||||||
extern __const char *__const _sys_errlist_internal[] attribute_hidden;
|
extern __const char *__const _sys_errlist_internal[] attribute_hidden;
|
||||||
extern int _sys_nerr_internal attribute_hidden;
|
extern int _sys_nerr_internal attribute_hidden;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 1991-2002, 2003, 2004 Free Software Foundation, Inc.
|
# Copyright (C) 1991-2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||||
# This file is part of the GNU C Library.
|
# This file is part of the GNU C Library.
|
||||||
|
|
||||||
# The GNU C Library is free software; you can redistribute it and/or
|
# The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -65,6 +65,8 @@ routines := brk sbrk sstk ioctl \
|
|||||||
|
|
||||||
distribute := device-nrs.h
|
distribute := device-nrs.h
|
||||||
|
|
||||||
|
generated := tst-error1.mtrace tst-error1-mem
|
||||||
|
|
||||||
include ../Makeconfig
|
include ../Makeconfig
|
||||||
|
|
||||||
aux := init-misc
|
aux := init-misc
|
||||||
@ -73,7 +75,11 @@ install-lib := libbsd-compat.a libg.a
|
|||||||
endif
|
endif
|
||||||
gpl2lgpl := error.c error.h
|
gpl2lgpl := error.c error.h
|
||||||
|
|
||||||
tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch
|
tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \
|
||||||
|
tst-error1
|
||||||
|
ifeq (no,$(cross-compiling))
|
||||||
|
tests: $(objpfx)tst-error1-mem
|
||||||
|
endif
|
||||||
|
|
||||||
CFLAGS-tsearch.c = $(uses-callbacks)
|
CFLAGS-tsearch.c = $(uses-callbacks)
|
||||||
CFLAGS-lsearch.c = $(uses-callbacks)
|
CFLAGS-lsearch.c = $(uses-callbacks)
|
||||||
@ -106,3 +112,8 @@ endif
|
|||||||
ifeq ($(build-bounded),yes)
|
ifeq ($(build-bounded),yes)
|
||||||
$(objpfx)tst-tsearch-bp: $(common-objpfx)math/libm_b.a
|
$(objpfx)tst-tsearch-bp: $(common-objpfx)math/libm_b.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
tst-error1-ENV = MALLOC_TRACE=$(objpfx)tst-error1.mtrace
|
||||||
|
tst-error1-ARGS = $(objpfx)tst-error1.out
|
||||||
|
$(objpfx)tst-error1-mem: $(objpfx)tst-error1.out
|
||||||
|
$(common-objpfx)malloc/mtrace $(objpfx)tst-error1.mtrace > $@
|
||||||
|
77
misc/error.c
77
misc/error.c
@ -1,7 +1,6 @@
|
|||||||
/* Error handler for noninteractive utilities
|
/* Error handler for noninteractive utilities
|
||||||
Copyright (C) 1990-1998, 2000-2003, 2004 Free Software Foundation, Inc.
|
Copyright (C) 1990-1998, 2000-2004, 2005 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library. Its master source is NOT part of
|
This file is part of the GNU C Library.
|
||||||
the C library, however. The master source lives in /gd/gnu/lib.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
modify it under the terms of the GNU Lesser General Public
|
||||||
@ -74,6 +73,7 @@ unsigned int error_message_count;
|
|||||||
|
|
||||||
# define program_name program_invocation_name
|
# define program_name program_invocation_name
|
||||||
# include <errno.h>
|
# include <errno.h>
|
||||||
|
# include <limits.h>
|
||||||
# include <libio/libioP.h>
|
# include <libio/libioP.h>
|
||||||
|
|
||||||
/* In GNU libc we want do not want to use the common name `error' directly.
|
/* In GNU libc we want do not want to use the common name `error' directly.
|
||||||
@ -158,14 +158,10 @@ print_errno_message (int errnum)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if _LIBC
|
#if _LIBC
|
||||||
if (_IO_fwide (stderr, 0) > 0)
|
__fxprintf (NULL, ": %s", L": %s", s);
|
||||||
{
|
#else
|
||||||
__fwprintf (stderr, L": %s", s);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fprintf (stderr, ": %s", s);
|
fprintf (stderr, ": %s", s);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VA_START
|
#ifdef VA_START
|
||||||
@ -182,14 +178,15 @@ error_tail (int status, int errnum, const char *message, va_list args)
|
|||||||
mbstate_t st;
|
mbstate_t st;
|
||||||
size_t res;
|
size_t res;
|
||||||
const char *tmp;
|
const char *tmp;
|
||||||
|
bool use_malloc = false;
|
||||||
|
|
||||||
do
|
while (1)
|
||||||
{
|
{
|
||||||
if (len < ALLOCA_LIMIT)
|
if (__libc_use_alloca (len * sizeof (wchar_t)))
|
||||||
wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
|
wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (wmessage != NULL && len / 2 < ALLOCA_LIMIT)
|
if (!use_malloc)
|
||||||
wmessage = NULL;
|
wmessage = NULL;
|
||||||
|
|
||||||
wchar_t *p = (wchar_t *) realloc (wmessage,
|
wchar_t *p = (wchar_t *) realloc (wmessage,
|
||||||
@ -201,18 +198,38 @@ error_tail (int status, int errnum, const char *message, va_list args)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
wmessage = p;
|
wmessage = p;
|
||||||
|
use_malloc = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset (&st, '\0', sizeof (st));
|
memset (&st, '\0', sizeof (st));
|
||||||
tmp = message;
|
tmp = message;
|
||||||
|
|
||||||
|
res = mbsrtowcs (wmessage, &tmp, len, &st);
|
||||||
|
if (res != len)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (__builtin_expect (len >= SIZE_MAX / 2, 0))
|
||||||
|
{
|
||||||
|
/* This reallyy should not happen if everything is fine. */
|
||||||
|
res = (size_t) -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
len *= 2;
|
||||||
}
|
}
|
||||||
while ((res = mbsrtowcs (wmessage, &tmp, len, &st)) == len);
|
|
||||||
|
|
||||||
if (res == (size_t) -1)
|
if (res == (size_t) -1)
|
||||||
/* The string cannot be converted. */
|
{
|
||||||
wmessage = (wchar_t *) L"???";
|
/* The string cannot be converted. */
|
||||||
|
if (use_malloc)
|
||||||
|
free (wmessage);
|
||||||
|
wmessage = (wchar_t *) L"???";
|
||||||
|
}
|
||||||
|
|
||||||
__vfwprintf (stderr, wmessage, args);
|
__vfwprintf (stderr, wmessage, args);
|
||||||
|
|
||||||
|
if (use_malloc)
|
||||||
|
free (wmessage);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
@ -226,11 +243,10 @@ error_tail (int status, int errnum, const char *message, va_list args)
|
|||||||
if (errnum)
|
if (errnum)
|
||||||
print_errno_message (errnum);
|
print_errno_message (errnum);
|
||||||
# if _LIBC
|
# if _LIBC
|
||||||
if (_IO_fwide (stderr, 0) > 0)
|
__fxprintf (NULL, "\n", L"\n");
|
||||||
putwc (L'\n', stderr);
|
# else
|
||||||
else
|
putc ('\n', stderr);
|
||||||
# endif
|
# endif
|
||||||
putc ('\n', stderr);
|
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
if (status)
|
if (status)
|
||||||
exit (status);
|
exit (status);
|
||||||
@ -275,11 +291,10 @@ error (status, errnum, message, va_alist)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if _LIBC
|
#if _LIBC
|
||||||
if (_IO_fwide (stderr, 0) > 0)
|
__fxprintf (NULL, "%s: ", L"%s: ", program_name);
|
||||||
__fwprintf (stderr, L"%s: ", program_name);
|
#else
|
||||||
else
|
fprintf (stderr, "%s: ", program_name);
|
||||||
#endif
|
#endif
|
||||||
fprintf (stderr, "%s: ", program_name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VA_START
|
#ifdef VA_START
|
||||||
@ -359,21 +374,19 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if _LIBC
|
#if _LIBC
|
||||||
if (_IO_fwide (stderr, 0) > 0)
|
__fxprintf (NULL, "%s:", L"%s: ", program_name);
|
||||||
__fwprintf (stderr, L"%s: ", program_name);
|
#else
|
||||||
else
|
fprintf (stderr, "%s:", program_name);
|
||||||
#endif
|
#endif
|
||||||
fprintf (stderr, "%s:", program_name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_name != NULL)
|
if (file_name != NULL)
|
||||||
{
|
{
|
||||||
#if _LIBC
|
#if _LIBC
|
||||||
if (_IO_fwide (stderr, 0) > 0)
|
__fxprintf (NULL, "%s:%d: ", L"%s:%d: ", file_name, line_number);
|
||||||
__fwprintf (stderr, L"%s:%d: ", file_name, line_number);
|
#else
|
||||||
else
|
fprintf (stderr, "%s:%d: ", file_name, line_number);
|
||||||
#endif
|
#endif
|
||||||
fprintf (stderr, "%s:%d: ", file_name, line_number);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VA_START
|
#ifdef VA_START
|
||||||
|
26
misc/tst-error1.c
Normal file
26
misc/tst-error1.c
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#include <error.h>
|
||||||
|
#include <mcheck.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
static int
|
||||||
|
do_test (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
mtrace ();
|
||||||
|
(void) freopen (argc == 1 ? "/dev/stdout" : argv[1], "a", stderr);
|
||||||
|
/* Orient the stream. */
|
||||||
|
fwprintf (stderr, L"hello world\n");
|
||||||
|
char buf[20000];
|
||||||
|
static const char str[] = "hello world! ";
|
||||||
|
for (int i = 0; i < 1000; ++i)
|
||||||
|
memcpy (&buf[i * (sizeof (str) - 1)], str, sizeof (str));
|
||||||
|
error (0, 0, str);
|
||||||
|
error (0, 0, buf);
|
||||||
|
error (0, 0, buf);
|
||||||
|
error (0, 0, str);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TEST_FUNCTION do_test (argc, argv)
|
||||||
|
#include "../test-skeleton.c"
|
@ -40,7 +40,7 @@ install-others = $(inst_includedir)/bits/stdio_lim.h
|
|||||||
|
|
||||||
include ../Makeconfig
|
include ../Makeconfig
|
||||||
|
|
||||||
aux := errlist siglist printf-parsemb printf-parsewc
|
aux := errlist siglist printf-parsemb printf-parsewc fxprintf
|
||||||
distribute := _itoa.h _itowa.h _i18n_number.h \
|
distribute := _itoa.h _itowa.h _i18n_number.h \
|
||||||
printf-parse.h stdio_lim.h.in tst-unbputc.sh tst-printf.sh
|
printf-parse.h stdio_lim.h.in tst-unbputc.sh tst-printf.sh
|
||||||
|
|
||||||
|
42
stdio-common/fxprintf.c
Normal file
42
stdio-common/fxprintf.c
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/* Copyright (C) 2005 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@gnu.org>.
|
||||||
|
|
||||||
|
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, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
__fxprintf (FILE *fp, const char *fmt, const wchar_t *wfmt, ...)
|
||||||
|
{
|
||||||
|
if (fp == NULL)
|
||||||
|
fp = stderr;
|
||||||
|
|
||||||
|
va_list ap;
|
||||||
|
va_start (ap, wfmt);
|
||||||
|
|
||||||
|
int res;
|
||||||
|
if (_IO_fwide (fp, 0) > 0)
|
||||||
|
res = __vfwprintf (fp, wfmt, ap);
|
||||||
|
else
|
||||||
|
res = _IO_vfprintf (fp, fmt, ap);
|
||||||
|
|
||||||
|
va_end (ap);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user