summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-04-26 20:18:18 +0000
committerJakub Jelinek <jakub@redhat.com>2006-04-26 20:18:18 +0000
commitdd8c67b33fb3d422afebc83c70e51e736669b0ad (patch)
tree40569cd29262da66f41d0700391b223ad437082e
parentcb5c27ecf31a91ad8b96aa8d4777a7d7b6b33b62 (diff)
Updated to fedora-glibc-20060426T2000
-rw-r--r--ChangeLog73
-rw-r--r--config.make.in1
-rwxr-xr-xconfigure83
-rw-r--r--configure.in7
-rw-r--r--fedora/branch.mk4
-rw-r--r--iconv/gconv_db.c4
-rw-r--r--iconvdata/Makefile3
-rw-r--r--iconvdata/tst-iconv6.c35
-rw-r--r--include/features.h2
-rw-r--r--locale/iso-4217.def15
-rw-r--r--localedata/ChangeLog14
-rw-r--r--localedata/Makefile4
-rw-r--r--localedata/locales/bg_BG2
-rw-r--r--localedata/locales/bs_BA2
-rw-r--r--localedata/locales/es_MX2
-rw-r--r--localedata/locales/es_UY2
-rw-r--r--localedata/locales/ru_RU2
-rw-r--r--localedata/locales/tg_TJ2
-rw-r--r--localedata/locales/tt_RU2
-rw-r--r--localedata/tst-strfmon1.c42
-rw-r--r--nscd/Makefile5
-rw-r--r--nscd/connections.c13
-rw-r--r--nscd/grpcache.c18
-rw-r--r--nscd/nscd-client.h4
-rw-r--r--nscd/nscd.conf5
-rw-r--r--nscd/nscd.h3
-rw-r--r--nscd/nscd_conf.c13
-rw-r--r--nscd/nscd_helper.c10
-rw-r--r--nscd/pwdcache.c17
-rw-r--r--nscd/selinux.c87
-rw-r--r--nscd/selinux.h12
-rw-r--r--resolv/res_hconf.c165
-rw-r--r--resolv/res_hconf.h13
-rw-r--r--stdio-common/printf_fp.c34
-rw-r--r--stdlib/strfmon_l.c41
-rw-r--r--sysdeps/posix/getaddrinfo.c2
-rw-r--r--sysdeps/unix/sysv/linux/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/ia64/clone2.S6
-rw-r--r--sysdeps/unix/sysv/linux/tst-clone.c56
39 files changed, 586 insertions, 221 deletions
diff --git a/ChangeLog b/ChangeLog
index 66ed5061c4..b62b22536b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,74 @@
+2006-04-26 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/posix/getaddrinfo.c (getaddrinfo): Fix typo which caused
+ bugs not to be reported.
+
+ * nscd/nscd.h (struct database_dyn): Add propagate field.
+ * nscd/nscd_conf.c (nscd_parse_file): Parse auto-propagate lines.
+ * nscd/nscd.conf: Add auto-propagate lines.
+ * nscd/connections.c (dbs): Initialize .propagate fields.
+ * nscd/grpcache.c (cache_addgr): Do not add ID entry for name lookups
+ and vice versa if propagation is disabled for the database.
+ * nscd/pwdcache.c (cache_addpw): Likewise.
+
+2006-04-26 James Antill <james.antill@redhat.com>
+ Ulrich Drepper <drepper@redhat.com>
+
+ * config.make.in: Add have-libcap.
+ * configure.in: Check for libcap.
+ * nscd/Makefile (selinux-LIBS): Add -lcap if possible.
+ * nscd/connections.c (finish_drop_privileges): When libcap is available
+ call preserve_capabilities and install_real_capabilities.
+ * nscd/selinux.c: Define preserve_capabilities and
+ install_real_capabilities.
+ * nscd/selinux.h: Declare preserve_capabilities and
+ install_real_capabilities.
+
+2006-04-26 Ulrich Drepper <drepper@redhat.com>
+
+ * locale/iso-4217.def: Update.
+
+2006-04-25 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #2420]
+ * stdlib/strfmon_l.c (__vstrfmon_l): Fix handling of ! modifier.
+ * localedata/Makefile: Add rules to build and run tst-strfmon1.
+ * localedata/tst-strfmon1.c: New file.
+
+ [BZ #2571]
+ * nscd/nscd_helper.c (__nscd_get_map_ref): Make mapptr argument a
+ volatile pointer so that the mapptr->mapped value is re-read after
+ the lock is retrieved.
+ * nscd/nscd-client.h: Update __nscd_get_map_ref prototype.
+
+ * include/features.h [_GNU_SOURCE] (_POSIX_C_SOURCE): Define to
+ 200112L.
+
+ * resolv/res_hconf.c: Minor surgery to 'cmd' and the referenced
+ functions to avoid relocations.
+
+ [BZ #2389]
+ * resolv/res_hconf.c: Remove 'order' parsing. Just ignore the line.
+ * resolv/res_hconf.h: Remove Name_Service definition.
+ (struct hconf): Replace service related fields with placeholders.
+
+ [BZ #2386]
+ * sysdeps/unix/sysv/linux/ia64/clone2.S: Check for NULL stack
+ pointers to match other architectures.
+ * sysdeps/unix/sysv/linux/Makefile [subdirs=misc] (tests): Add
+ tst-clone.
+ * sysdeps/unix/sysv/linux/tst-clone.c: New file.
+
+ [BZ #2072]
+ * stdio-common/printf_fp.c: Fix potential memory leaks for
+ malloc'ed wbuffer which isn't freed in error conditions.
+
+ [BZ #2569]
+ * iconv/gconv_db.c (__gconv_release_step): Fix condition of assert
+ call.
+ * iconvdata/Makefile (tests): Add tst-iconv6.
+ * iconvdata/tst-iconv6.c: New file.
+
2006-04-24 Ulrich Drepper <drepper@redhat.com>
* posix/tst-rfc3484.c (do_test): Also initialize source_addr_flags
@@ -7,7 +78,7 @@
* posix/tst-rfc3484.c: Include <ifaddrs.h> early.
* posix/tst-rfc3484-2.c: Likewise.
- * version.h (VERSION): Bunp to 2.4.90 for the trunk.
+ * version.h (VERSION): Bump to 2.4.90 for the trunk.
2006-04-24 Jakub Jelinek <jakub@redhat.com>
diff --git a/config.make.in b/config.make.in
index 292dea667b..bc8998cd1f 100644
--- a/config.make.in
+++ b/config.make.in
@@ -61,6 +61,7 @@ have-fpie = @libc_cv_fpie@
have-ssp = @libc_cv_ssp@
have-selinux = @have_selinux@
have-libaudit = @have_libaudit@
+have-libcap = @have_libcap@
have-cc-with-libunwind = @libc_cv_cc_with_libunwind@
fno-unit-at-a-time = @fno_unit_at_a_time@
bind-now = @bindnow@
diff --git a/configure b/configure
index 82188b299b..b9c8ee8c39 100755
--- a/configure
+++ b/configure
@@ -313,7 +313,7 @@ ac_includes_default="\
# include <unistd.h>
#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 add_on_subdirs base_machine submachine sysnames sysdeps_add_ons 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 CXX_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_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 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 add_on_subdirs base_machine submachine sysnames sysdeps_add_ons 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 CXX_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_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_libcap 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 elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -6831,6 +6831,86 @@ _ACEOF
fi
+
+ # See if we have the libcap library
+ echo "$as_me:$LINENO: checking for cap_init in -lcap" >&5
+echo $ECHO_N "checking for cap_init in -lcap... $ECHO_C" >&6
+if test "${ac_cv_lib_cap_cap_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcap $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char cap_init ();
+int
+main ()
+{
+cap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (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); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (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
+ ac_cv_lib_cap_cap_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_cap_cap_init=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_cap_cap_init" >&5
+echo "${ECHO_T}$ac_cv_lib_cap_cap_init" >&6
+if test $ac_cv_lib_cap_cap_init = yes; then
+ have_libcap=yes
+else
+ have_libcap=no
+fi
+
+ if test "x$have_libcap" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBCAP 1
+_ACEOF
+
+ fi
+
fi
@@ -8423,6 +8503,7 @@ s,@no_whole_archive@,$no_whole_archive,;t t
s,@exceptions@,$exceptions,;t t
s,@LIBGD@,$LIBGD,;t t
s,@have_libaudit@,$have_libaudit,;t t
+s,@have_libcap@,$have_libcap,;t t
s,@have_selinux@,$have_selinux,;t t
s,@EGREP@,$EGREP,;t t
s,@sizeof_long_double@,$sizeof_long_double,;t t
diff --git a/configure.in b/configure.in
index 83f09de805..79fa32ec2b 100644
--- a/configure.in
+++ b/configure.in
@@ -1982,6 +1982,13 @@ if test "x$have_selinux" = xyes; then
AC_DEFINE(HAVE_LIBAUDIT, 1, [SELinux libaudit support])
fi
AC_SUBST(have_libaudit)
+
+ # See if we have the libcap library
+ AC_CHECK_LIB(cap, cap_init, have_libcap=yes, have_libcap=no)
+ if test "x$have_libcap" = xyes; then
+ AC_DEFINE(HAVE_LIBCAP, 1, [SELinux libcap support])
+ fi
+ AC_SUBST(have_libcap)
fi
AC_SUBST(have_selinux)
diff --git a/fedora/branch.mk b/fedora/branch.mk
index 09345d02cc..3c74097cd1 100644
--- a/fedora/branch.mk
+++ b/fedora/branch.mk
@@ -3,5 +3,5 @@ glibc-branch := fedora
glibc-base := HEAD
DIST_BRANCH := devel
COLLECTION := dist-fc4
-fedora-sync-date := 2006-04-25 09:03 UTC
-fedora-sync-tag := fedora-glibc-20060425T0903
+fedora-sync-date := 2006-04-26 20:00 UTC
+fedora-sync-tag := fedora-glibc-20060426T2000
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
index 3431ce0812..6540cc393c 100644
--- a/iconv/gconv_db.c
+++ b/iconv/gconv_db.c
@@ -1,5 +1,5 @@
/* Provide access to the collection of available transformation modules.
- Copyright (C) 1997-2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1997-2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -227,7 +227,7 @@ __gconv_release_step (struct __gconv_step *step)
step->__shlib_handle = NULL;
#endif
}
- else
+ else if (step->__shlib_handle == NULL)
/* Builtin modules should not have end functions. */
assert (step->__end_fct == NULL);
}
diff --git a/iconvdata/Makefile b/iconvdata/Makefile
index 1c80df16cf..1d3259179a 100644
--- a/iconvdata/Makefile
+++ b/iconvdata/Makefile
@@ -65,7 +65,8 @@ modules.so := $(addsuffix .so, $(modules))
include ../Makeconfig
ifeq (yes,$(build-shared))
-tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4
+tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \
+ tst-iconv6
ifeq ($(have-thread-library),yes)
tests += bug-iconv3
endif
diff --git a/iconvdata/tst-iconv6.c b/iconvdata/tst-iconv6.c
new file mode 100644
index 0000000000..accb21b113
--- /dev/null
+++ b/iconvdata/tst-iconv6.c
@@ -0,0 +1,35 @@
+/* BZ #2569 */
+
+#include <iconv.h>
+#include <stdio.h>
+
+static int
+do_test (void)
+{
+ iconv_t cd0 = iconv_open ("ISO-8859-7", "UTF-16LE");
+ if (cd0 == (iconv_t) -1)
+ {
+ puts ("first iconv_open failed");
+ return 1;
+ }
+ iconv_t cd1 = iconv_open ("ISO-8859-7", "UTF-16LE");
+ if (cd1 == (iconv_t) -1)
+ {
+ puts ("second iconv_open failed");
+ return 1;
+ }
+ if (iconv_close (cd0) != 0)
+ {
+ puts ("first iconv_close failed");
+ return 1;
+ }
+ if (iconv_close (cd1) != 0)
+ {
+ puts ("second iconv_close failed");
+ return 1;
+ }
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/include/features.h b/include/features.h
index 656caaf639..2428e08038 100644
--- a/include/features.h
+++ b/include/features.h
@@ -151,7 +151,7 @@
# undef _POSIX_SOURCE
# define _POSIX_SOURCE 1
# undef _POSIX_C_SOURCE
-# define _POSIX_C_SOURCE 199506L
+# define _POSIX_C_SOURCE 200112L
# undef _XOPEN_SOURCE
# define _XOPEN_SOURCE 600
# undef _XOPEN_SOURCE_EXTENDED
diff --git a/locale/iso-4217.def b/locale/iso-4217.def
index fff5e40584..a40813271a 100644
--- a/locale/iso-4217.def
+++ b/locale/iso-4217.def
@@ -10,7 +10,7 @@
*/
DEFINE_INT_CURR("ADP") /* Andorran Peseta -> EUR */
DEFINE_INT_CURR("AED") /* United Arab Emirates Dirham */
-DEFINE_INT_CURR("AFA") /* Afghanistan Afgani */
+DEFINE_INT_CURR("AFN") /* Afghanistan Afgani */
DEFINE_INT_CURR("ALL") /* Albanian Lek */
DEFINE_INT_CURR("AMD") /* Armenia Dram */
DEFINE_INT_CURR("ANG") /* Netherlands Antilles */
@@ -20,11 +20,11 @@ DEFINE_INT_CURR("ATS") /* Austrian Schilling -> EUR */
DEFINE_INT_CURR("AUD") /* Australian Dollar */
DEFINE_INT_CURR("AWG") /* Aruba Guilder */
DEFINE_INT_CURR("AZM") /* Azerbaijan Manat */
-DEFINE_INT_CURR("BAK") /* Bosnian and Herzegovina Convertible Mark */
+DEFINE_INT_CURR("BAM") /* Bosnian and Herzegovina Convertible Mark */
DEFINE_INT_CURR("BBD") /* Barbados Dollar */
DEFINE_INT_CURR("BDT") /* Bangladesh Taka */
DEFINE_INT_CURR("BEF") /* Belgian Franc -> EUR */
-DEFINE_INT_CURR("BGL") /* Bulgarian Lev */
+DEFINE_INT_CURR("BGN") /* Bulgarian Lev */
DEFINE_INT_CURR("BHD") /* Bahraini Dinar */
DEFINE_INT_CURR("BIF") /* Burundi Franc */
DEFINE_INT_CURR("BMD") /* Burmudian Dollar */
@@ -86,6 +86,7 @@ DEFINE_INT_CURR("IQD") /* Iraqi Dinar */
DEFINE_INT_CURR("IRR") /* Iranian Rial */
DEFINE_INT_CURR("ISK") /* Iceland Krona */
DEFINE_INT_CURR("ITL") /* Italian Lira -> EUR */
+DEFINE_INT_CURR("JEP") /* Jersey Pound */
DEFINE_INT_CURR("JMD") /* Jamaican Dollar */
DEFINE_INT_CURR("JOD") /* Jordanian Dinar */
DEFINE_INT_CURR("JPY") /* Japanese Yen */
@@ -119,7 +120,7 @@ DEFINE_INT_CURR("MTL") /* Maltese Lira */
DEFINE_INT_CURR("MUR") /* Mauritius Rupee */
DEFINE_INT_CURR("MVR") /* Maldives Rupee */
DEFINE_INT_CURR("MWK") /* Malawi Kwacha */
-DEFINE_INT_CURR("MXP") /* Mexican Peso */
+DEFINE_INT_CURR("MXN") /* Mexican Peso */
DEFINE_INT_CURR("MYR") /* Malaysian Ringgit */
DEFINE_INT_CURR("MZM") /* Mozambique Metical */
DEFINE_INT_CURR("NAD") /* Namibia Dollar */
@@ -140,7 +141,8 @@ DEFINE_INT_CURR("PTE") /* Portugese Escudo -> EUR */
DEFINE_INT_CURR("PYG") /* Paraguay Guarani */
DEFINE_INT_CURR("QAR") /* Qatar Rial */
DEFINE_INT_CURR("ROL") /* Romanian Leu */
-DEFINE_INT_CURR("RUR") /* Russian Ruble */
+DEFINE_INT_CURR("RON") /* Romanian New Leu */
+DEFINE_INT_CURR("RUB") /* Russian Ruble */
DEFINE_INT_CURR("RWF") /* Rwanda Franc */
DEFINE_INT_CURR("SAR") /* Saudi Arabia Riyal */
DEFINE_INT_CURR("SBD") /* Solomon Islands Dollar */
@@ -160,7 +162,7 @@ DEFINE_INT_CURR("SVC") /* El Salvador Colon */
DEFINE_INT_CURR("SYP") /* Syrian Arab Republic Pound */
DEFINE_INT_CURR("SZL") /* Swaziland Lilangeni */
DEFINE_INT_CURR("THB") /* Thai Baht */
-DEFINE_INT_CURR("TJR") /* Tajikistani Ruble */
+DEFINE_INT_CURR("TJS") /* Tajikistani Somoni */
DEFINE_INT_CURR("TMM") /* Turkmenistan Manet */
DEFINE_INT_CURR("TND") /* Tunisian Dinar */
DEFINE_INT_CURR("TOP") /* Tonga Pa'Anga */
@@ -184,7 +186,6 @@ DEFINE_INT_CURR("XDR") /* International Monetary Fund */
DEFINE_INT_CURR("XOF") /* West African Franc (Benin, Ivory Coast, Niger, Senegal, Togo, Upper Volta) */
DEFINE_INT_CURR("XPF") /* French polynesia, New Caledonia, Wallis and Futuna Islands */
DEFINE_INT_CURR("YER") /* Yemeni Rial */
-DEFINE_INT_CURR("YUM") /* Yugoslavian New Dinar */
DEFINE_INT_CURR("ZAR") /* South Africa Rand (Lesotho, Namibia) */
DEFINE_INT_CURR("ZMK") /* Zambian Kwacha */
DEFINE_INT_CURR("ZWD") /* Zimbabwe Dollar */
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index de23e123e3..addfec9c9d 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,17 @@
+2006-04-26 Ulrich Drepper <drepper@redhat.com>
+
+ * bg_BG: Update after iso-4217.def update.
+ * bs_BA: Likewise.
+ * es_MX: Likewise.
+ * ru_RU: Likewise.
+ * tg_TJ: Likewise.
+ * tt_RU: Likewise.
+
+2006-04-25 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #2376]
+ * locales/es_UY: Change curreny_symbol.
+
2006-04-24 Ulrich Drepper <drepper@redhat.com>
[BZ #2349]
diff --git a/localedata/Makefile b/localedata/Makefile
index ed76a897d0..278cd71081 100644
--- a/localedata/Makefile
+++ b/localedata/Makefile
@@ -92,7 +92,8 @@ locale_test_suite := tst_iswalnum tst_iswalpha tst_iswcntrl \
tst_wctype tst_wcwidth
tests = $(locale_test_suite) tst-digits tst-setlocale bug-iconv-trans \
- tst-leaks tst-mbswcs6 tst-xlocale1 tst-xlocale2 bug-usesetlocale
+ tst-leaks tst-mbswcs6 tst-xlocale1 tst-xlocale2 bug-usesetlocale \
+ tst-strfmon1
ifeq (yes,$(build-shared))
ifneq (no,$(PERL))
tests: $(objpfx)mtrace-tst-leaks
@@ -283,6 +284,7 @@ tst-digits-ENV = $(TEST_MBWC_ENV)
tst-mbswcs6-ENV = $(TEST_MBWC_ENV)
tst-xlocale1-ENV = $(TEST_MBWC_ENV)
tst-xlocale2-ENV = $(TEST_MBWC_ENV)
+tst-strfmon1-ENV = $(TEST_MBWC_ENV)
tst-setlocale-ENV = LOCPATH=$(common-objpfx)localedata LC_ALL=ja_JP.EUC-JP
diff --git a/localedata/locales/bg_BG b/localedata/locales/bg_BG
index 2736174c4a..bb15588f84 100644
--- a/localedata/locales/bg_BG
+++ b/localedata/locales/bg_BG
@@ -155,7 +155,7 @@ reorder-end
END LC_COLLATE
LC_MONETARY
-int_curr_symbol "<U0042><U0047><U004C><U0020>"
+int_curr_symbol "<U0042><U0047><U004E><U0020>"
currency_symbol "<U043B><U0432>"
mon_decimal_point "<U002C>"
mon_thousands_sep "<U00A0>"
diff --git a/localedata/locales/bs_BA b/localedata/locales/bs_BA
index 80cc49ffda..9d0a0e6376 100644
--- a/localedata/locales/bs_BA
+++ b/localedata/locales/bs_BA
@@ -149,7 +149,7 @@ noexpr "<U005E><U005B><U006E><U004E><U005D><U002A><U002E>"
END LC_MESSAGES
LC_MONETARY
-int_curr_symbol "<U0042><U0041><U004B><U0020>"
+int_curr_symbol "<U0042><U0041><U004D><U0020>"
currency_symbol "<U004B><U004D>"
mon_decimal_point "<U002C>"
mon_thousands_sep "<U0020>"
diff --git a/localedata/locales/es_MX b/localedata/locales/es_MX
index 70e5ae7abb..d090008da6 100644
--- a/localedata/locales/es_MX
+++ b/localedata/locales/es_MX
@@ -61,7 +61,7 @@ noexpr "<U005E><U005B><U006E><U004E><U005D><U002E><U002A>"
END LC_MESSAGES
LC_MONETARY
-int_curr_symbol "<U004D><U0058><U0050><U0020>"
+int_curr_symbol "<U004D><U0058><U004E><U0020>"
currency_symbol "<U0024>"
mon_decimal_point "<U002E>"
mon_thousands_sep "<U002C>"
diff --git a/localedata/locales/es_UY b/localedata/locales/es_UY
index 36d18b1af2..50f8019da2 100644
--- a/localedata/locales/es_UY
+++ b/localedata/locales/es_UY
@@ -62,7 +62,7 @@ END LC_MESSAGES
LC_MONETARY
int_curr_symbol "<U0055><U0059><U0055><U0020>"
-currency_symbol "<U004E><U0024>"
+currency_symbol "<U0024>"
mon_decimal_point "<U002C>"
mon_thousands_sep "<U002E>"
mon_grouping 3;3
diff --git a/localedata/locales/ru_RU b/localedata/locales/ru_RU
index 2fdffb12cb..0308c5b79a 100644
--- a/localedata/locales/ru_RU
+++ b/localedata/locales/ru_RU
@@ -74,7 +74,7 @@ noexpr "<U005E><U005B><U041D><U043D><U004E><U006E><U005D><U002E><U002A>"
END LC_MESSAGES
LC_MONETARY
-int_curr_symbol "<U0052><U0055><U0052><U0020>"
+int_curr_symbol "<U0052><U0055><U0042><U0020>"
currency_symbol "<U0440><U0443><U0431>"
mon_decimal_point "<U002E>"
mon_thousands_sep "<U0020>"
diff --git a/localedata/locales/tg_TJ b/localedata/locales/tg_TJ
index 3f9b58a1fb..5cd8422259 100644
--- a/localedata/locales/tg_TJ
+++ b/localedata/locales/tg_TJ
@@ -126,7 +126,7 @@ noexpr "<U005E><U005B><U041D><U043D><U004E><U006E><U005D><U002E><U002A>"
END LC_MESSAGES
LC_MONETARY
-int_curr_symbol "<U0052><U0055><U0052><U0020>"
+int_curr_symbol "<U0052><U0055><U0053><U0020>"
currency_symbol "<U0440><U0443><U0431>"
mon_decimal_point "<U002E>"
mon_thousands_sep "<U0020>"
diff --git a/localedata/locales/tt_RU b/localedata/locales/tt_RU
index 31a3de1c2b..858cfb8f4f 100644
--- a/localedata/locales/tt_RU
+++ b/localedata/locales/tt_RU
@@ -227,7 +227,7 @@ noexpr "<U005E><U005B><U041D><U043D><U004E><U006E><U005D><U002E><U002A>"
END LC_MESSAGES
LC_MONETARY
-int_curr_symbol "<U0052><U0055><U0052><U0020>"
+int_curr_symbol "<U0052><U0055><U0042><U0020>"
currency_symbol "<U0440><U0443><U0431>"
mon_decimal_point "<U002E>"
mon_thousands_sep "<U0020>"
diff --git a/localedata/tst-strfmon1.c b/localedata/tst-strfmon1.c
new file mode 100644
index 0000000000..e30aa1b204
--- /dev/null
+++ b/localedata/tst-strfmon1.c
@@ -0,0 +1,42 @@
+#include <monetary.h>
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+
+static const struct
+{
+ const char *locale;
+ const char *expected;
+} tests[] =
+ {
+ { "de_DE.ISO-8859-1", "|-12,34 EUR|-12,34|" },
+ { "da_DK.ISO-8859-1", "|kr -12,34|-12,34|" },
+ { "zh_TW.EUC-TW", "|-NT$12.34|-12.34|" },
+ { "sv_SE.ISO-8859-1", "|-12,34 kr|-12,34|" }
+ };
+#define ntests (sizeof (tests) / sizeof (tests[0]))
+
+
+static int
+do_test (void)
+{
+ int res = 0;
+ for (int i = 0; i < ntests; ++i)
+ {
+ char buf[500];
+ if (setlocale (LC_ALL, tests[i].locale) == NULL)
+ {
+ printf ("failed to set locale %s\n", tests[i].locale);
+ res = 1;
+ continue;
+ }
+ strfmon (buf, sizeof (buf), "|%n|%!n|", -12.34, -12.34);
+ int fail = strcmp (buf, tests[i].expected) != 0;
+ printf ("%s%s\n", buf, fail ? " *** FAIL ***" : "");
+ res |= fail;
+ }
+ return res;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nscd/Makefile b/nscd/Makefile
index 0b35964e7b..9c98018217 100644
--- a/nscd/Makefile
+++ b/nscd/Makefile
@@ -55,10 +55,13 @@ all-nscd-modules := $(nscd-modules) selinux
ifeq (yes,$(have-selinux))
ifeq (yes,$(have-libaudit))
libaudit = -laudit
+ifeq (yes,$(have-libcap))
+libcap = -lcap
+endif
endif
nscd-modules += selinux
-selinux-LIBS := -lselinux $(libaudit)
+selinux-LIBS := -lselinux $(libaudit) $(libcap)
# The configure.in check for libselinux and its headers did not use
# $SYSINCLUDES. The directory specified by --with-headers usually
diff --git a/nscd/connections.c b/nscd/connections.c
index 0426e6346f..a52082cba3 100644
--- a/nscd/connections.c
+++ b/nscd/connections.c
@@ -103,6 +103,7 @@ struct database_dyn dbs[lastdb] =
.enabled = 0,
.check_file = 1,
.persistent = 0,
+ .propagate = 1,
.shared = 0,
.max_db_size = DEFAULT_MAX_DB_SIZE,
.filename = "/etc/passwd",
@@ -119,6 +120,7 @@ struct database_dyn dbs[lastdb] =
.enabled = 0,
.check_file = 1,
.persistent = 0,
+ .propagate = 1,
.shared = 0,
.max_db_size = DEFAULT_MAX_DB_SIZE,
.filename = "/etc/group",
@@ -135,6 +137,7 @@ struct database_dyn dbs[lastdb] =
.enabled = 0,
.check_file = 1,
.persistent = 0,
+ .propagate = 0, /* Not used. */
.shared = 0,
.max_db_size = DEFAULT_MAX_DB_SIZE,
.filename = "/etc/hosts",
@@ -1859,6 +1862,11 @@ begin_drop_privileges (void)
static void
finish_drop_privileges (void)
{
+#if defined HAVE_LIBAUDIT && defined HAVE_LIBCAP
+ /* We need to preserve the capabilities to connect to the audit daemon. */
+ cap_t new_caps = preserve_capabilities ();
+#endif
+
if (setgroups (server_ngroups, server_groups) == -1)
{
dbg_log (_("Failed to run nscd as user '%s'"), server_user);
@@ -1878,6 +1886,11 @@ finish_drop_privileges (void)
perror ("setuid");
exit (4);
}
+
+#if defined HAVE_LIBAUDIT && defined HAVE_LIBCAP
+ /* Remove the temporary capabilities. */
+ install_real_capabilities (new_caps);
+#endif
}
/* Handle the HUP signal which will force a dump of the cache */
diff --git a/nscd/grpcache.c b/nscd/grpcache.c
index 4bc9977bc4..5a8fba4759 100644
--- a/nscd/grpcache.c
+++ b/nscd/grpcache.c
@@ -342,10 +342,10 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
marked with FIRST first. Otherwise we end up with
dangling "pointers" in case a latter hash entry cannot be
added. */
- bool first = req->type == GETGRBYNAME;
+ bool first = true;
/* If the request was by GID, add that entry first. */
- if (req->type != GETGRBYNAME)
+ if (req->type == GETGRBYGID)
{
if (cache_add (GETGRBYGID, cp, key_offset, &dataset->head, true,
db, owner) < 0)
@@ -355,12 +355,14 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
dataset->head.usable = false;
goto out;
}
+
+ first = false;
}
/* If the key is different from the name add a separate entry. */
else if (strcmp (key_copy, gr_name) != 0)
{
if (cache_add (GETGRBYNAME, key_copy, key_len + 1,
- &dataset->head, first, db, owner) < 0)
+ &dataset->head, true, db, owner) < 0)
{
/* Could not allocate memory. Make sure the data gets
discarded. */
@@ -372,11 +374,13 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
}
/* We have to add the value for both, byname and byuid. */
- if (__builtin_expect (cache_add (GETGRBYNAME, gr_name, gr_name_len,
- &dataset->head, first, db, owner)
- == 0, 1))
+ if ((req->type == GETGRBYNAME || db->propagate)
+ && __builtin_expect (cache_add (GETGRBYNAME, gr_name,
+ gr_name_len,
+ &dataset->head, first, db, owner)
+ == 0, 1))
{
- if (req->type == GETGRBYNAME)
+ if (req->type == GETGRBYNAME && db->propagate)
(void) cache_add (GETGRBYGID, cp, key_offset, &dataset->head,
req->type != GETGRBYNAME, db, owner);
}
diff --git a/nscd/nscd-client.h b/nscd/nscd-client.h
index 98c167eb62..440697f1be 100644
--- a/nscd/nscd-client.h
+++ b/nscd/nscd-client.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 1998, 1999, 2000, 2003, 2004, 2005
+/* Copyright (c) 1998, 1999, 2000, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
@@ -277,7 +277,7 @@ extern int __nscd_open_socket (const char *key, size_t keylen,
/* Get reference of mapping. */
extern struct mapped_database *__nscd_get_map_ref (request_type type,
const char *name,
- struct locked_map_ptr *mapptr,
+ volatile struct locked_map_ptr *mapptr,
int *gc_cyclep);
/* Unmap database. */
diff --git a/nscd/nscd.conf b/nscd/nscd.conf
index bde8e36219..4cdcb7dc9e 100644
--- a/nscd/nscd.conf
+++ b/nscd/nscd.conf
@@ -23,7 +23,8 @@
# check-files <service> <yes|no>
# persistent <service> <yes|no>
# shared <service> <yes|no>
-# max-db-szie <service> <number bytes>
+# max-db-size <service> <number bytes>
+* auto-propagate <service> <yes|no>
#
# Currently supported cache names (services): passwd, group, hosts
#
@@ -47,6 +48,7 @@
persistent passwd yes
shared passwd yes
max-db-size passwd 33554432
+ auto-propagate passwd yes
enable-cache group yes
positive-time-to-live group 3600
@@ -56,6 +58,7 @@
persistent group yes
shared group yes
max-db-size group 33554432
+ auto-propagate group yes
enable-cache hosts yes
positive-time-to-live hosts 3600
diff --git a/nscd/nscd.h b/nscd/nscd.h
index ed686bea7e..f826c7ada4 100644
--- a/nscd/nscd.h
+++ b/nscd/nscd.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004, 2005
+/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
@@ -63,6 +63,7 @@ struct database_dyn
int check_file;
int persistent;
int shared;
+ int propagate;
size_t max_db_size;
const char *filename;
const char *db_filename;
diff --git a/nscd/nscd_conf.c b/nscd/nscd_conf.c
index 579ddd402f..2048eca886 100644
--- a/nscd/nscd_conf.c
+++ b/nscd/nscd_conf.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1998, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (c) 1998,2000,2003,2004,2005,2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
@@ -256,6 +256,17 @@ nscd_parse_file (const char *fname, struct database_dyn dbs[lastdb])
else
error (0, 0, _("Must specify value for restart-interval option"));
}
+ else if (strcmp (entry, "auto-propagate") == 0)
+ {
+ int idx = find_db (arg1);
+ if (idx >= 0)
+ {
+ if (strcmp (arg2, "no") == 0)
+ dbs[idx].propagate = 0;
+ else if (strcmp (arg2, "yes") == 0)
+ dbs[idx].propagate = 1;
+ }
+ }
else
error (0, 0, _("Unknown option: %s %s %s"), entry, arg1, arg2);
}
diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c
index fd749446be..1dfe746d7a 100644
--- a/nscd/nscd_helper.c
+++ b/nscd/nscd_helper.c
@@ -316,17 +316,18 @@ get_mapping (request_type type, const char *key,
struct mapped_database *
__nscd_get_map_ref (request_type type, const char *name,
- struct locked_map_ptr *mapptr, int *gc_cyclep)
+ volatile struct locked_map_ptr *mapptr, int *gc_cyclep)
{
struct mapped_database *cur = mapptr->mapped;
if (cur == NO_MAPPING)
return cur;
int cnt = 0;
- while (atomic_compare_and_exchange_val_acq (&mapptr->lock, 1, 0) != 0)
+ while (__builtin_expect (atomic_compare_and_exchange_val_acq (&mapptr->lock,
+ 1, 0) != 0, 0))
{
// XXX Best number of rounds?
- if (++cnt > 5)
+ if (__builtin_expect (++cnt > 5, 0))
return NO_MAPPING;
atomic_delay ();
@@ -340,7 +341,8 @@ __nscd_get_map_ref (request_type type, const char *name,
if (cur == NULL
|| (cur->head->nscd_certainly_running == 0
&& cur->head->timestamp + MAPPING_TIMEOUT < time (NULL)))
- cur = get_mapping (type, name, &mapptr->mapped);
+ cur = get_mapping (type, name,
+ (struct mapped_database **) &mapptr->mapped);
if (__builtin_expect (cur != NO_MAPPING, 1))
{
diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c
index 2daff79d78..01c223add5 100644
--- a/nscd/pwdcache.c
+++ b/nscd/pwdcache.c
@@ -338,10 +338,10 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
marked with FIRST first. Otherwise we end up with
dangling "pointers" in case a latter hash entry cannot be
added. */
- bool first = req->type == GETPWBYNAME;
+ bool first = true;
/* If the request was by UID, add that entry first. */
- if (req->type != GETPWBYNAME)
+ if (req->type == GETPWBYUID)
{
if (cache_add (GETPWBYUID, cp, key_offset, &dataset->head, true,
db, owner) < 0)
@@ -351,12 +351,14 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
dataset->head.usable = false;
goto out;
}
+
+ first = false;
}
/* If the key is different from the name add a separate entry. */
else if (strcmp (key_copy, dataset->strdata) != 0)
{
if (cache_add (GETPWBYNAME, key_copy, key_len + 1,
- &dataset->head, first, db, owner) < 0)
+ &dataset->head, true, db, owner) < 0)
{
/* Could not allocate memory. Make sure the data gets
discarded. */
@@ -368,11 +370,12 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
}
/* We have to add the value for both, byname and byuid. */
- if (__builtin_expect (cache_add (GETPWBYNAME, dataset->strdata,
- pw_name_len, &dataset->head, first,
- db, owner) == 0, 1))
+ if ((req->type == GETPWBYNAME || db->propagate)
+ && __builtin_expect (cache_add (GETPWBYNAME, dataset->strdata,
+ pw_name_len, &dataset->head,
+ first, db, owner) == 0, 1))
{
- if (req->type == GETPWBYNAME)
+ if (req->type == GETPWBYNAME && db->propagate)
(void) cache_add (GETPWBYUID, cp, key_offset, &dataset->head,
req->type != GETPWBYNAME, db, owner);
}
diff --git a/nscd/selinux.c b/nscd/selinux.c
index c59251f1b5..f123d68b93 100644
--- a/nscd/selinux.c
+++ b/nscd/selinux.c
@@ -28,12 +28,13 @@
#include <stdlib.h>
#include <syslog.h>
#include <unistd.h>
+#include <sys/prctl.h>
#include <selinux/av_permissions.h>
#include <selinux/avc.h>
#include <selinux/flask.h>
#include <selinux/selinux.h>
#ifdef HAVE_LIBAUDIT
-#include <libaudit.h>
+# include <libaudit.h>
#endif
#include "dbg_log.h"
@@ -149,6 +150,90 @@ audit_init (void)
&& errno != EINVAL && errno != EPROTONOSUPPORT && errno != EAFNOSUPPORT)
dbg_log (_("Failed opening connection to the audit subsystem: %m"));
}
+
+
+# ifdef HAVE_LIBCAP
+static const cap_value_t new_cap_list[] =
+ { CAP_AUDIT_WRITE };
+# define nnew_cap_list (sizeof (new_cap_list) / sizeof (new_cap_list[0]))
+static const cap_value_t tmp_cap_list[] =
+ { CAP_AUDIT_WRITE, CAP_SETUID, CAP_SETGID };
+# define ntmp_cap_list (sizeof (tmp_cap_list) / sizeof (tmp_cap_list[0]))
+
+cap_t
+preserve_capabilities (void)
+{
+ if (getuid () != 0)
+ /* Not root, then we cannot preserve anything. */
+ return NULL;
+
+ if (prctl (PR_SET_KEEPCAPS, 1) == -1)
+ {
+ dbg_log (_("Failed to set keep-capabilities"));
+ error (EXIT_FAILURE, errno, _("prctl(KEEPCAPS) failed"));
+ /* NOTREACHED */
+ }
+
+ cap_t tmp_caps = cap_init ();
+ cap_t new_caps;
+ if (tmp_caps != NULL)
+ new_caps = cap_init ();
+
+ if (tmp_caps == NULL || new_caps == NULL)
+ {
+ if (tmp_caps != NULL)
+ free_caps (tmp_caps);
+
+ dbg_log (_("Failed to initialize drop of capabilities"));
+ error (EXIT_FAILURE, 0, _("cap_init failed"));
+ }
+
+ /* There is no reason why these should not work. */
+ cap_set_flag (new_caps, CAP_PERMITTED, nnew_cap_list, new_cap_list, CAP_SET);
+ cap_set_flag (new_caps, CAP_EFFECTIVE, nnew_cap_list, new_cap_list, CAP_SET);
+
+ cap_set_flag (tmp_caps, CAP_PERMITTED, ntmp_cap_list, tmp_cap_list, CAP_SET);
+ cap_set_flag (tmp_caps, CAP_EFFECTIVE, ntmp_cap_list, tmp_cap_list, CAP_SET);
+
+ int res = cap_set_proc (tmp_caps);
+
+ cap_free (tmp_caps);
+
+ if (__builtin_expect (res != 0, 0))
+ {
+ cap_free (new_caps);
+ dbg_log (_("Failed to drop capabilities\n"));
+ error (EXIT_FAILURE, 0, _("cap_set_proc failed"));
+ }
+
+ return new_caps;
+}
+
+void
+install_real_capabilities (cap_t new_caps)
+{
+ /* If we have no capabilities there is nothing to do here. */
+ if (new_caps == NULL)
+ return;
+
+ if (cap_set_proc (new_caps))
+ {
+ cap_free (new_caps);
+ dbg_log (_("Failed to drop capabilities"));
+ error (EXIT_FAILURE, 0, _("cap_set_proc failed"));
+ /* NOTREACHED */
+ }
+
+ cap_free (new_caps);
+
+ if (prctl (PR_SET_KEEPCAPS, 0) == -1)
+ {
+ dbg_log (_("Failed to unset keep-capabilities"));
+ error (EXIT_FAILURE, errno, _("prctl(KEEPCAPS) failed"));
+ /* NOTREACHED */
+ }
+}
+# endif /* HAVE_LIBCAP */
#endif /* HAVE_LIBAUDIT */
/* Determine if we are running on an SELinux kernel. Set selinux_enabled
diff --git a/nscd/selinux.h b/nscd/selinux.h
index b9eb053aa0..9ce0628486 100644
--- a/nscd/selinux.h
+++ b/nscd/selinux.h
@@ -1,5 +1,5 @@
/* Header for nscd SELinux access controls.
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Matthew Rickard <mjricka@epoch.ncsc.mil>, 2004.
@@ -22,6 +22,9 @@
#define _SELINUX_H 1
#include "nscd.h"
+#ifdef HAVE_LIBCAP
+# include <sys/capabilities.h>
+#endif
#ifdef HAVE_SELINUX
/* Global variable to tell if the kernel has SELinux support. */
@@ -42,6 +45,13 @@ extern int nscd_request_avc_has_perm (int fd, request_type req);
extern void nscd_avc_cache_stats (struct avc_cache_stats *cstats);
/* Display statistics on AVC usage. */
extern void nscd_avc_print_stats (struct avc_cache_stats *cstats);
+
+# ifdef HAVE_LIBCAP
+/* Preserve capabilities to connect to connnect to the audit daemon. */
+extern cap_t preserve_capabilities (void);
+/* Install final capabilities. */
+extern void install_real_capabilities (cap_t new_caps);
+# endif
#else
# define selinux_enabled 0
# define nscd_avc_init() (void) 0
diff --git a/resolv/res_hconf.c b/resolv/res_hconf.c
index c54b28dadd..f45888933f 100644
--- a/resolv/res_hconf.c
+++ b/resolv/res_hconf.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995-2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995-2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger (davidm@azstarnet.com).
@@ -53,35 +53,34 @@
/* Environment vars that all user to override default behavior: */
#define ENV_HOSTCONF "RESOLV_HOST_CONF"
-#define ENV_SERVORDER "RESOLV_SERV_ORDER"
#define ENV_SPOOF "RESOLV_SPOOF_CHECK"
#define ENV_TRIM_OVERR "RESOLV_OVERRIDE_TRIM_DOMAINS"
#define ENV_TRIM_ADD "RESOLV_ADD_TRIM_DOMAINS"
#define ENV_MULTI "RESOLV_MULTI"
#define ENV_REORDER "RESOLV_REORDER"
-static const char *arg_service_list (const char *, int, const char *,
- unsigned int);
-static const char *arg_trimdomain_list (const char *, int, const char *,
- unsigned int);
-static const char *arg_spoof (const char *, int, const char *, unsigned int);
-static const char *arg_bool (const char *, int, const char *, unsigned int);
+enum parse_cbs
+ {
+ CB_none,
+ CB_arg_trimdomain_list,
+ CB_arg_spoof,
+ CB_arg_bool
+ };
static const struct cmd
{
- const char *name;
- const char *(*parse_args) (const char * filename, int line_num,
- const char * args, unsigned int arg);
+ const char name[11];
+ uint8_t cb;
unsigned int arg;
} cmd[] =
{
- {"order", arg_service_list, 0},
- {"trim", arg_trimdomain_list, 0},
- {"spoof", arg_spoof, 0},
- {"multi", arg_bool, HCONF_FLAG_MULTI},
- {"nospoof", arg_bool, HCONF_FLAG_SPOOF},
- {"spoofalert", arg_bool, HCONF_FLAG_SPOOFALERT},
- {"reorder", arg_bool, HCONF_FLAG_REORDER}
+ {"order", CB_none, 0},
+ {"trim", CB_arg_trimdomain_list, 0},
+ {"spoof", CB_arg_spoof, 0},
+ {"multi", CB_arg_bool, HCONF_FLAG_MULTI},
+ {"nospoof", CB_arg_bool, HCONF_FLAG_SPOOF},
+ {"spoofalert", CB_arg_bool, HCONF_FLAG_SPOOFALERT},
+ {"reorder", CB_arg_bool, HCONF_FLAG_REORDER}
};
/* Structure containing the state. */
@@ -107,103 +106,7 @@ skip_string (const char *str)
static const char *
-arg_service_list (const char *fname, int line_num, const char *args,
- unsigned int arg)
-{
- enum Name_Service service;
- const char *start;
- size_t len;
- size_t i;
- static const struct
- {
- const char name[6];
- int16_t service;
- } svcs[] =
- {
- {"bind", SERVICE_BIND},
- {"hosts", SERVICE_HOSTS},
- {"nis", SERVICE_NIS},
- };
-
- do
- {
- start = args;
- args = skip_string (args);
- len = args - start;
-
- service = SERVICE_NONE;
- for (i = 0; i < sizeof (svcs) / sizeof (svcs[0]); ++i)
- {
- if (__strncasecmp (start, svcs[i].name, len) == 0
- && len == strlen (svcs[i].name))
- {
- service = svcs[i].service;
- break;
- }
- }
- if (service == SERVICE_NONE)
- {
- char *buf;
-
- if (__asprintf (&buf,
- _("%s: line %d: expected service, found `%s'\n"),
- fname, line_num, start) < 0)
- return 0;
-
- __fxprintf (NULL, "%s", buf);
-
- free (buf);
- return 0;
- }
- if (_res_hconf.num_services >= SERVICE_MAX)
- {
- char *buf;
-
- if (__asprintf (&buf, _("\
-%s: line %d: cannot specify more than %d services"),
- fname, line_num, SERVICE_MAX) < 0)
- return 0;
-
- __fxprintf (NULL, "%s", buf);
-
- free (buf);
- return 0;
- }
- _res_hconf.service[_res_hconf.num_services++] = service;
-
- args = skip_ws (args);
- switch (*args)
- {
- case ',':
- case ';':
- case ':':
- args = skip_ws (++args);
- if (!*args || *args == '#')
- {
- char *buf;
-
- if (__asprintf (&buf, _("\
-%s: line %d: list delimiter not followed by keyword"),
- fname, line_num) < 0)
- return 0;
-
- __fxprintf (NULL, "%s", buf);
-
- free (buf);
- return 0;
- }
- default:
- break;
- }
- }
- while (*args && *args != '#');
- return args;
-}
-
-
-static const char *
-arg_trimdomain_list (const char *fname, int line_num, const char *args,
- unsigned int flag)
+arg_trimdomain_list (const char *fname, int line_num, const char *args)
{
const char * start;
size_t len;
@@ -259,7 +162,7 @@ arg_trimdomain_list (const char *fname, int line_num, const char *args,
static const char *
-arg_spoof (const char *fname, int line_num, const char *args, unsigned flag)
+arg_spoof (const char *fname, int line_num, const char *args)
{
const char *start = args;
size_t len;
@@ -353,7 +256,17 @@ parse_line (const char *fname, int line_num, const char *str)
/* process args: */
str = skip_ws (str);
- str = (*c->parse_args) (fname, line_num, str, c->arg);
+
+ if (c->cb == CB_arg_trimdomain_list)
+ str = arg_trimdomain_list (fname, line_num, str);
+ else if (c->cb == CB_arg_spoof)
+ str = arg_spoof (fname, line_num, str);
+ else if (c->cb == CB_arg_bool)
+ str = arg_bool (fname, line_num, str, c->arg);
+ else
+ /* Ignore the line. */
+ return;
+
if (!str)
return;
@@ -396,10 +309,7 @@ do_init (void)
hconf_name = _PATH_HOSTCONF;
fp = fopen (hconf_name, "rc");
- if (!fp)
- /* make up something reasonable: */
- _res_hconf.service[_res_hconf.num_services++] = SERVICE_BIND;
- else
+ if (fp)
{
/* No threads using this stream. */
__fsetlocking (fp, FSETLOCKING_BYCALLER);
@@ -413,16 +323,9 @@ do_init (void)
fclose (fp);
}
- envval = getenv (ENV_SERVORDER);
- if (envval)
- {
- _res_hconf.num_services = 0;
- arg_service_list (ENV_SERVORDER, 1, envval, 0);
- }
-
envval = getenv (ENV_SPOOF);
if (envval)
- arg_spoof (ENV_SPOOF, 1, envval, 0);
+ arg_spoof (ENV_SPOOF, 1, envval);
envval = getenv (ENV_MULTI);
if (envval)
@@ -434,13 +337,13 @@ do_init (void)
envval = getenv (ENV_TRIM_ADD);
if (envval)
- arg_trimdomain_list (ENV_TRIM_ADD, 1, envval, 0);
+ arg_trimdomain_list (ENV_TRIM_ADD, 1, envval);
envval = getenv (ENV_TRIM_OVERR);
if (envval)
{
_res_hconf.num_trimdomains = 0;
- arg_trimdomain_list (ENV_TRIM_OVERR, 1, envval, 0);
+ arg_trimdomain_list (ENV_TRIM_OVERR, 1, envval);
}
_res_hconf.initialized = 1;
diff --git a/resolv/res_hconf.h b/resolv/res_hconf.h
index 77eeca4dea..b40da0df74 100644
--- a/resolv/res_hconf.h
+++ b/resolv/res_hconf.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995-1998, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger (davidm@azstarnet.com).
@@ -24,18 +24,11 @@
#define TRIMDOMAINS_MAX 4
-enum Name_Service
-{
- SERVICE_NONE = 0,
- SERVICE_BIND, SERVICE_HOSTS, SERVICE_NIS,
- SERVICE_MAX
-};
-
struct hconf
{
int initialized;
- int num_services;
- enum Name_Service service[SERVICE_MAX];
+ int unused1;
+ int unused2[4];
int num_trimdomains;
const char *trimdomain[TRIMDOMAINS_MAX];
unsigned int flags;
diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c
index 8a68f1948d..e4e32f9c28 100644
--- a/stdio-common/printf_fp.c
+++ b/stdio-common/printf_fp.c
@@ -72,7 +72,11 @@
{ \
register const int outc = (ch); \
if (putc (outc, fp) == EOF) \
- return -1; \
+ { \
+ if (buffer_malloced) \
+ free (wbuffer); \
+ return -1; \
+ } \
++done; \
} while (0)
@@ -83,7 +87,11 @@
if (len > 20) \
{ \
if (PUT (fp, wide ? (const char *) wptr : ptr, outlen) != outlen) \
- return -1; \
+ { \
+ if (buffer_malloced) \
+ free (wbuffer); \
+ return -1; \
+ } \
ptr += outlen; \
done += outlen; \
} \
@@ -102,7 +110,11 @@
do \
{ \
if (PAD (fp, ch, len) != len) \
- return -1; \
+ { \
+ if (buffer_malloced) \
+ free (wbuffer); \
+ return -1; \
+ } \
done += len; \
} \
while (0)
@@ -200,6 +212,11 @@ ___printf_fp (FILE *fp,
/* Nonzero if this is output on a wide character stream. */
int wide = info->wide;
+ /* Buffer in which we produce the output. */
+ wchar_t *wbuffer = NULL;
+ /* Flag whether wbuffer is malloc'ed or not. */
+ int buffer_malloced = 0;
+
auto wchar_t hack_digit (void);
wchar_t hack_digit (void)
@@ -790,8 +807,7 @@ ___printf_fp (FILE *fp,
{
int width = info->width;
- wchar_t *wbuffer, *wstartp, *wcp;
- int buffer_malloced;
+ wchar_t *wstartp, *wcp;
int chars_needed;
int expscale;
int intdig_max, intdig_no = 0;
@@ -1109,8 +1125,12 @@ ___printf_fp (FILE *fp,
buffer = (char *) malloc (2 + chars_needed + decimal_len
+ ngroups * thousands_sep_len);
if (buffer == NULL)
- /* Signal an error to the caller. */
- return -1;
+ {
+ /* Signal an error to the caller. */
+ if (buffer_malloced)
+ free (wbuffer);
+ return -1;
+ }
}
else
buffer = (char *) alloca (2 + chars_needed + decimal_len
diff --git a/stdlib/strfmon_l.c b/stdlib/strfmon_l.c
index f6d52e0b56..c9f3a47b41 100644
--- a/stdlib/strfmon_l.c
+++ b/stdlib/strfmon_l.c
@@ -486,23 +486,21 @@ __vstrfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format,
}
if (print_curr_symbol)
- {
- out_string (currency_symbol);
+ out_string (currency_symbol);
- if (sign_posn == 4)
- {
- if (sep_by_space == 2)
- out_char (space_char);
- out_string (sign_string);
- if (sep_by_space == 1)
- /* POSIX.2 and SUS are not clear on this case, but C99
- says a space follows the adjacent-symbol-and-sign */
- out_char (' ');
- }
- else
- if (sep_by_space == 1)
- out_char (space_char);
+ if (sign_posn == 4)
+ {
+ if (print_curr_symbol && sep_by_space == 2)
+ out_char (space_char);
+ out_string (sign_string);
+ if (sep_by_space == 1)
+ /* POSIX.2 and SUS are not clear on this case, but C99
+ says a space follows the adjacent-symbol-and-sign */
+ out_char (' ');
}
+ else
+ if (print_curr_symbol && sep_by_space == 1)
+ out_char (space_char);
}
else
if (sign_posn != 0 && sign_posn != 2 && sign_posn != 3
@@ -561,12 +559,13 @@ __vstrfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format,
|| (sign_posn == 0 && sep_by_space == 1))
out_char (space_char);
out_nstring (currency_symbol, currency_symbol_len);
- if (sign_posn == 4)
- {
- if (sep_by_space == 2)
- out_char (' ');
- out_string (sign_string);
- }
+ }
+
+ if (sign_posn == 4)
+ {
+ if (sep_by_space == 2)
+ out_char (' ');
+ out_string (sign_string);
}
}
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index e4fea334ca..03d26086ac 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -1643,7 +1643,7 @@ getaddrinfo (const char *name, const char *service,
freeaddrinfo (p);
free (in6ai);
- return -(i & GAIH_EAI);
+ return -(last_i & GAIH_EAI);
}
if (end)
while (*end)
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 812cd97c80..8bec6cdb85 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -28,6 +28,8 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
install-others += $(inst_includedir)/bits/syscall.h
+tests += tst-clone
+
# Generate the list of SYS_* macros for the system calls (__NR_* macros).
# For bi-arch platforms, the CPU/Makefile defines {32,64}bit-predefine and
# we generate a file that uses <bits/wordsize.h>.
diff --git a/sysdeps/unix/sysv/linux/ia64/clone2.S b/sysdeps/unix/sysv/linux/ia64/clone2.S
index 69c9e05044..d38eb201ad 100644
--- a/sysdeps/unix/sysv/linux/ia64/clone2.S
+++ b/sysdeps/unix/sysv/linux/ia64/clone2.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001, 2003, 2004, 2006 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
@@ -32,10 +32,12 @@ ENTRY(__clone2)
.prologue
alloc r2=ar.pfs,8,1,6,0
cmp.eq p6,p0=0,in0
+ cmp.eq p7,p0=0,in1
mov r8=EINVAL
mov out0=in3 /* Flags are first syscall argument. */
mov out1=in1 /* Stack address. */
-(p6) br.cond.spnt.many __syscall_error
+(p6) br.cond.spnt.many __syscall_error /* no NULL function pointers */
+(p7) br.cond.spnt.many __syscall_error /* no NULL stack pointers */
;;
mov out2=in2 /* Stack size. */
mov out3=in5 /* Parent TID Pointer */
diff --git a/sysdeps/unix/sysv/linux/tst-clone.c b/sysdeps/unix/sysv/linux/tst-clone.c
new file mode 100644
index 0000000000..8e249c2f04
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tst-clone.c
@@ -0,0 +1,56 @@
+/* Test for proper error/errno handling in clone.
+ Copyright (C) 2006 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* BZ #2386 */
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sched.h>
+
+int child_fn(void *arg)
+{
+ puts ("FAIL: in child_fn(); should not be here");
+ exit(1);
+}
+
+static int
+do_test (void)
+{
+ int result;
+
+#ifdef __ia64__
+ result = __clone2(child_fn, NULL, 0, 0, NULL, NULL, NULL);
+#else
+ result = clone(child_fn, NULL, (int) NULL, NULL);
+#endif
+
+ if (errno != EINVAL || result != -1)
+ {
+ printf ("FAIL: clone()=%d (wanted -1) errno=%d (wanted %d)\n",
+ result, errno, EINVAL);
+ return 1;
+ }
+
+ puts ("All OK");
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"