Updated to fedora-glibc-20060426T2000
authorjakub <jakub>
Wed, 26 Apr 2006 20:18:16 +0000 (20:18 +0000)
committerjakub <jakub>
Wed, 26 Apr 2006 20:18:16 +0000 (20:18 +0000)
39 files changed:
ChangeLog
config.make.in
configure
configure.in
fedora/branch.mk
iconv/gconv_db.c
iconvdata/Makefile
iconvdata/tst-iconv6.c [new file with mode: 0644]
include/features.h
locale/iso-4217.def
localedata/ChangeLog
localedata/Makefile
localedata/locales/bg_BG
localedata/locales/bs_BA
localedata/locales/es_MX
localedata/locales/es_UY
localedata/locales/ru_RU
localedata/locales/tg_TJ
localedata/locales/tt_RU
localedata/tst-strfmon1.c [new file with mode: 0644]
nscd/Makefile
nscd/connections.c
nscd/grpcache.c
nscd/nscd-client.h
nscd/nscd.conf
nscd/nscd.h
nscd/nscd_conf.c
nscd/nscd_helper.c
nscd/pwdcache.c
nscd/selinux.c
nscd/selinux.h
resolv/res_hconf.c
resolv/res_hconf.h
stdio-common/printf_fp.c
stdlib/strfmon_l.c
sysdeps/posix/getaddrinfo.c
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/ia64/clone2.S
sysdeps/unix/sysv/linux/tst-clone.c [new file with mode: 0644]

index 66ed506..b62b225 100644 (file)
--- 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>
 
index 292dea6..bc8998c 100644 (file)
@@ -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@
index 82188b2..b9c8ee8 100755 (executable)
--- 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
index 83f09de..79fa32e 100644 (file)
@@ -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)
 
index 09345d0..3c74097 100644 (file)
@@ -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
index 3431ce0..6540cc3 100644 (file)
@@ -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);
 }
index 1c80df1..1d32591 100644 (file)
@@ -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 (file)
index 0000000..accb21b
--- /dev/null
@@ -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"
index 656caaf..2428e08 100644 (file)
 # 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
index fff5e40..a408132 100644 (file)
@@ -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  */
index de23e12..addfec9 100644 (file)
@@ -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]
index ed76a89..278cd71 100644 (file)
@@ -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
 
index 2736174..bb15588 100644 (file)
@@ -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>"
index 80cc49f..9d0a0e6 100644 (file)
@@ -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>"
index 70e5ae7..d090008 100644 (file)
@@ -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>"
index 36d18b1..50f8019 100644 (file)
@@ -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
index 2fdffb1..0308c5b 100644 (file)
@@ -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>"
index 3f9b58a..5cd8422 100644 (file)
@@ -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>"
index 31a3de1..858cfb8 100644 (file)
@@ -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 (file)
index 0000000..e30aa1b
--- /dev/null
@@ -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"
index 0b35964..9c98018 100644 (file)
@@ -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
index 0426e63..a52082c 100644 (file)
@@ -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 */
index 4bc9977..5a8fba4 100644 (file)
@@ -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);
            }
index 98c167e..440697f 100644 (file)
@@ -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.  */
index bde8e36..4cdcb7d 100644 (file)
@@ -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
index ed686be..f826c7a 100644 (file)
@@ -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;
index 579ddd4..2048eca 100644 (file)
@@ -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);
     }
index fd74944..1dfe746 100644 (file)
@@ -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))
        {
index 2daff79..01c223a 100644 (file)
@@ -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);
            }
index c59251f..f123d68 100644 (file)
 #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
index b9eb053..9ce0628 100644 (file)
@@ -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
index c54b28d..f458889 100644 (file)
@@ -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).
 
 
 /* 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;
index 77eeca4..b40da0d 100644 (file)
@@ -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).
 
 
 #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;
index 8a68f19..e4e32f9 100644 (file)
     {                                                                        \
       register const int outc = (ch);                                        \
       if (putc (outc, fp) == EOF)                                            \
-       return -1;                                                            \
+       {                                                                     \
+         if (buffer_malloced)                                                \
+           free (wbuffer);                                                   \
+         return -1;                                                          \
+       }                                                                     \
       ++done;                                                                \
     } while (0)
 
       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;                                                     \
        }                                                                     \
   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
index f6d52e0..c9f3a47 100644 (file)
@@ -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);
            }
        }
 
index e4fea33..03d2608 100644 (file)
@@ -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)
index 812cd97..8bec6cd 100644 (file)
@@ -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>.
index 69c9e05..d38eb20 100644 (file)
@@ -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 (file)
index 0000000..8e249c2
--- /dev/null
@@ -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"