[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [SRM] Uploading new upstream stable version to Squeeze?



On Fri, Jun 17, 2011 at 10:48:51AM +0100, Adam D. Barratt wrote:
> On Sat, 2011-06-11 at 21:27 +0200, Aurelien Jarno wrote:
> > On Wed, Jun 08, 2011 at 07:12:57PM +0200, Philipp Kern wrote:
> > > Aurelien,
> > > 
> > > On Sun, Jun 05, 2011 at 12:23:51PM +0200, Aurelien Jarno wrote:
> > > > I am therefore thinking about uploading the next upstream stable version
> > > > (2.11.4 is currently in test period, it will be released in the next
> > > > days), similarly to what is currently done for the kernel. What's your
> > > > opinion on that, is it something that you would allow?
> > > 
> > > [3] and [4] look fine, I'd like to see the whole diff against Squeeze, though.
> > > Is it reviewable?  (Added test cases also seem like a great idea, FWIW.)
> [..]
> > If it is possible to upload such a version, I'll integrate that in the
> > SVN and I'll provide a full diff of the debian/ directory for final 
> > review. We'll include some small other changes (e.g. support for kernel 
> > 3.0 in the preinst script).
> 
> Thanks.  From what I've seen, I'd be interested in seeing the fixes
> applied to p-u.
> 
> Given the timescales of the upcoming 6.0.2 and the larger-than-usual
> size of the diff, we'd prefer to look at getting this uploaded early in
> the 6.0.3 cycle, to give us a longer period with the updated version
> available for testing.
> 

Unfortunately the 2.11.4 release never happened upstream, it's seems to
be blocked currently. I have therefore prepare an upload with the
current upstream branch. For that I have upgraded the tarball to 2.11.3
(which includes the version bump, so that the version of the package
matches the one in the binary), and put the remaining of the branch to
svn-updates.diff.

Here is the changelog:

| eglibc (2.11.3-1) stable; urgency=low
| 
|   * Update from stable upstream version, and update from the upstream
|     stable branch:
|     - fix wrong memmove/bcopy optimization with gcc-4.6.  Closes: #619963.
|     - fix an integer overflow in fnmatch() (CVE-2011-1659).  Closes: #626370.
|     - fix spurious warning in bswap_16() with -Wconversion.  Closes: #561249.
|     - fix auxiliary cache file creation.  Closes: #588218.
|     - fix memory corruption in fnmatch() that can lead to code execution
|       (CVE-2011-1071).  Closes: #615120
|     - fix strchr() on x86-64 CPU with SSE4.2.  Closes: #635885
|   * Update patches:
|     - patches/locale/locale-print-LANGUAGE.diff
|     - patches/hppa/local-stack-grows-up.diff
|     - patches/m68k/cvs-tls-support.patch
|     - patches/any/local-disable-test-tgmath2.diff
|     - patches/any/submitted-longdouble.diff
|     - patches/any/submitted-bits-fcntl_h-at.diff
|     - patches/kfreebsd/local-readdir_r.diff
|   * Drop obsolete patches:
|     - patches/any/cvs-redirect-throw.diff
|     - patches/any/cvs-flush-cache-textrels.diff
|     - patches/hurd-i386/cvs-linkat.diff
|     - patches/hurd-i386/cvs-select.diff
|     - patches/sparc/submitted-epoll.diff
|     - patches/any/cvs-dont-expand-dst-twice.diff
|     - patches/amd64/cvs-avx-tcb-alignment.diff
|     - patches/any/submitted-etc-resolv.conf.diff
|     - patches/any/cvs-audit-suid.diff
|   * kfreebsd/local-sysdeps.diff, update to r3665 (from squeeze glibc-bsd).
|     - fixes LD_PRELOAD with a kfreebsd-9 kernel. Closes: #630695.
|     - uses upstream RFTSIGZMB for exit signal selection when available.
|     - fixes a crash in if_nameindex() with more than 3 interfaces.
|   * Fix preinst script wrt 3.0 kernel. Patch by Colin Watson.  Closes: 
|     #630077.
|   * Update submitted-resolv.conf-thread.diff from upstream to fix a
|     deadlock in some rare cases.
|   * Add patches/any/cvs-resolv-different-nameserver.diff and
|     patches/any/submitted-resolv-assert.diff to try a different
|     nameserver if the first one returns REFUSED.  Closes: #535504.
|   * Add patches/any/cvs-getaddrinfo-single-lookup.diff to fix fallback to
|     single lookup dns requests.  Closes: #541167.
|   * Add patches/any/cvs-pthread-setgroups.diff to fix setgroups() with
|     multiple threads.
| 
|  -- Aurelien Jarno <aurel32@debian.org>  Sat, 11 Jun 2011 18:12:35 +0200


The only changes on the upstream side since you reviewed the changes is
this arm change:

| 2011-06-30  Richard Sandiford  <richard.sandiford@linaro.org>
| 
|        * sysdeps/arm/elf/start.S (_start): Align the constant pool to 4 bytes.

I had to remove some patches that have been merged upstream or slightly
updates some other due to collision with the upstream changes.

Here are some more details about the remaining changes:

|   * kfreebsd/local-sysdeps.diff, update to r3665 (from squeeze glibc-bsd).
|     - fixes LD_PRELOAD with a kfreebsd-9 kernel. Closes: #630695.

This patch will be needed for sane upgrade to wheezy or for backported
kfreebsd-9 kernel. It is in sid for 1.5 month.

|     - uses upstream RFTSIGZMB for exit signal selection when available.

This patch is needed to make Debian GNU/kFreeBSD working on unmodified
(recent) FreeBSD kernels, for example in a jail. It is in sid for 1.5
months.

|     - fixes a crash in if_nameindex() with more than 3 interfaces.

This patch fixes a crash for people having more than 3 network
interfaces, it is in sid for 2 months and in wheezy for 1.5 months.

|   * Fix preinst script wrt 3.0 kernel. Patch by Colin Watson.  Closes: 
|     #630077.

This patch is needed to make the glibc installable on a 3.0 kernel (ie 2
digits only). The patch is in sid for 2 months, and 1.5 months in
wheezy.

|   * Update submitted-resolv.conf-thread.diff from upstream to fix a
|     deadlock in some rare cases.

This bug has been reported through the eglibc mailing list, by people
using Debian [1]. The patch is in upstream (EGLIBC) for 2 months, in sid
for 1.5 months and in wheezy for 3 months.

[1] http://www.eglibc.org/archives/patches/msg00972.html

|   * Add patches/any/cvs-resolv-different-nameserver.diff and
|     patches/any/submitted-resolv-assert.diff to try a different
|     nameserver if the first one returns REFUSED.  Closes: #535504.

These patches makes having more than one nameserver in /etc/resolv.conf
actually useful, it is based on a patch from upstream, plus some fixes
from myself. Both are in unstable for 1.5 months.

|   * Add patches/any/cvs-getaddrinfo-single-lookup.diff to fix fallback to
|     single lookup dns requests.  Closes: #541167.

This patch is necessary for setups with broken DNS server returning none 
or crazy answer to IPv6 request. A mitigation has been implemented a 
long time ago, but the setting was not remember between DNS requests.
This patch is in upstream and sid for 1.5 months.

|   * Add patches/any/cvs-pthread-setgroups.diff to fix setgroups() with
|     multiple threads.

This patch fixes setgroups() between multiple threads, which might lead
to security issues. It is in uptream for more than 6 months and in 
wheezy/sid for more than 3 months.


I have attached the patches above to this mail, as well as the full
debdiff. If you prefer a diff of the source tree with all patches
applied, just ask. Would it be possible to upload this version in 
stable?

Thanks,
Aurelien


-- 
Aurelien Jarno	                        GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net
Index: local-sysdeps.diff
===================================================================
--- local-sysdeps.diff	(révision 4469)
+++ local-sysdeps.diff	(copie de travail)
@@ -3175,6 +3175,46 @@
 +#define _DIRENT_HAVE_D_NAMLEN 1
 +#define _DIRENT_HAVE_D_TYPE 1
 --- /dev/null
++++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/bits/elf.h
+@@ -0,0 +1,37 @@
++/* This file defines standard ELF types, structures, and macros.
++   Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010
++	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.  */
++
++#ifndef _BITS_ELF_H
++#define _BITS_ELF_H
++
++__BEGIN_DECLS
++
++#define	AT_EXECPATH	15	/* Path to the executable. */
++#define	AT_CANARY	16	/* Canary for SSP. */
++#define	AT_CANARYLEN	17	/* Length of the canary. */
++#define	AT_OSRELDATE	18	/* OSRELDATE. */
++#define	AT_NCPUS	19	/* Number of CPUs. */
++#define	AT_PAGESIZES	20	/* Pagesizes. */
++#define	AT_PAGESIZESLEN	21	/* Number of pagesizes. */
++#define	AT_STACKPROT	23	/* Initial stack protection. */
++
++__END_DECLS
++
++#endif	/* elf.h */
+--- /dev/null
 +++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/bits/errno.h
 @@ -0,0 +1,183 @@
 +/*-
@@ -7291,7 +7331,7 @@
 +#include <sysdeps/unix/clock_settime.c>
 --- /dev/null
 +++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/clone.c
-@@ -0,0 +1,108 @@
+@@ -0,0 +1,143 @@
 +/* Create a thread.
 +   Copyright (C) 2002 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -7320,6 +7360,28 @@
 +#include <stddef.h>
 +#undef __clone
 +
++
++#include <sys/sysctl.h>
++
++static inline int
++__kernel_osreldate(void)
++{
++    static int osreldate;
++
++    int mib[2];
++    size_t size;
++
++    if (osreldate == 0)
++    {
++	mib[0] = CTL_KERN;
++	mib[1] = KERN_OSRELDATE;
++	size = sizeof osreldate;
++	if (__sysctl(mib, 2, &osreldate, &size, NULL, 0) == -1)
++		return (-1);
++    }		
++    return (osreldate);
++}
++
 +/* __start_thread (flags, child_stack, fn, arg)
 +   is roughly equivalent to
 +
@@ -7357,7 +7419,20 @@
 +    }
 +
 +  if ((flags & CSIGNAL) != SIGCHLD)
++  {
++    if (__kernel_osreldate() >= 802510)
++                /* we slightly cheat here, */
++                /* the 9.x snapshot prior to r223966 does not support it too */
 +    {
++      if ((flags & CSIGNAL) & ~RFTSIGMASK)
++	{
++	  __set_errno (EINVAL);
++	  return -1;
++	}
++        rfork_flags |= (RFTSIGZMB | RFTSIGFLAGS(flags & CSIGNAL));
++    }
++    else
++    {
 +      if ((flags & CSIGNAL) & ~RFTHPNMASK)
 +	{
 +	  __set_errno (EINVAL);
@@ -7368,7 +7443,7 @@
 +      else
 +        rfork_flags |= (RFLINUXTHPN | ((flags & CSIGNAL) <<  RFTHPNSHIFT));
 +    }
-+
++  } 
 +  if (flags & CLONE_VM)
 +    rfork_flags |= RFMEM;
 +
@@ -8495,10 +8570,58 @@
 +}
 +
 --- /dev/null
++++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/dl-support.c
+@@ -0,0 +1,44 @@
++/* Dynamic linker system dependencies for GNU/kFreeBSD.
++   Copyright (C) 2011 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.  */
++
++#define _dl_aux_init _dl_aux_init_ignored_code
++#include <elf/dl-support.c>
++#include <bits/elf.h>
++#undef _dl_aux_init
++
++#ifdef HAVE_AUX_VECTOR
++void
++internal_function
++_dl_aux_init (ElfW(auxv_t) *av)
++{
++  for (; av->a_type != AT_NULL; ++av)
++    switch (av->a_type)
++      {
++      case AT_PAGESZ:
++	GLRO(dl_pagesize) = av->a_un.a_val;
++	break;
++      case AT_PHDR:
++	GL(dl_phdr) = (void *) av->a_un.a_val;
++	break;
++      case AT_PHNUM:
++	GL(dl_phnum) = av->a_un.a_val;
++	break;
++      }
++}
++#endif
+--- /dev/null
 +++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/dl-sysdep.c
-@@ -0,0 +1,56 @@
+@@ -0,0 +1,248 @@
 +/* Dynamic linker system dependencies for GNU/kFreeBSD.
-+   Copyright (C) 2008 Free Software Foundation, Inc.
++   Copyright (C) 1995-1998,2000-2008,2009,2010,2011
++        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
@@ -8527,9 +8650,200 @@
 +#include <kernel-features.h>
 +
 +#ifdef SHARED
++# define _dl_sysdep_start _dl_sysdep_start_ignored_code
++# define _dl_show_auxv _dl_show_auxv_ignored_code
 +# include <elf/dl-sysdep.c>
++# include <bits/elf.h>
++# undef _dl_sysdep_start
++# undef _dl_show_auxv
++
++ElfW(Addr)
++_dl_sysdep_start (void **start_argptr,
++		  void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
++				   ElfW(Addr) *user_entry))
++{
++  const ElfW(Phdr) *phdr = NULL;
++  ElfW(Word) phnum = 0;
++  ElfW(Addr) user_entry;
++  ElfW(auxv_t) *av;
++  uid_t uid = 0;
++  gid_t gid = 0;
++#ifdef NEED_DL_SYSINFO
++  uintptr_t new_sysinfo = 0;
 +#endif
 +
++  __libc_stack_end = DL_STACK_END (start_argptr);
++  DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, INTUSE(_dl_argv), _environ,
++			  _dl_auxv);
++
++  user_entry = (ElfW(Addr)) ENTRY_POINT;
++  GLRO(dl_platform) = NULL; /* Default to nothing known about the platform.  */
++
++  for (av = _dl_auxv; av->a_type != AT_NULL; av++)
++    switch (av->a_type)
++      {
++      case AT_PHDR:
++	phdr = (void *) av->a_un.a_val;
++	break;
++      case AT_PHNUM:
++	phnum = av->a_un.a_val;
++	break;
++      case AT_PAGESZ:
++	GLRO(dl_pagesize) = av->a_un.a_val;
++	break;
++      case AT_ENTRY:
++	user_entry = av->a_un.a_val;
++	break;
++#ifdef NEED_DL_BASE_ADDR
++      case AT_BASE:
++	_dl_base_addr = av->a_un.a_val;
++	break;
++#endif
++      }
++
++    {
++      /* Fill in the values we have not gotten from the kernel through the
++	 auxiliary vector.  */
++#  undef SEE
++#  define SEE(UID, var, uid) \
++   var ^= __get##uid ()
++      SEE (UID, uid, uid);
++      SEE (EUID, uid, euid);
++      SEE (GID, gid, gid);
++      SEE (EGID, gid, egid);
++
++      /* If one of the two pairs of IDs does not match this is a setuid
++	 or setgid run.  */
++      INTUSE(__libc_enable_secure) = uid | gid;
++    }
++
++#ifndef HAVE_AUX_PAGESIZE
++  if (GLRO(dl_pagesize) == 0)
++    GLRO(dl_pagesize) = __getpagesize ();
++#endif
++
++#if defined NEED_DL_SYSINFO
++  /* Only set the sysinfo value if we also have the vsyscall DSO.  */
++  if (GLRO(dl_sysinfo_dso) != 0 && new_sysinfo)
++    GLRO(dl_sysinfo) = new_sysinfo;
++#endif
++
++#ifdef DL_SYSDEP_INIT
++  DL_SYSDEP_INIT;
++#endif
++
++#ifdef DL_PLATFORM_INIT
++  DL_PLATFORM_INIT;
++#endif
++
++  /* Determine the length of the platform name.  */
++  if (GLRO(dl_platform) != NULL)
++    GLRO(dl_platformlen) = strlen (GLRO(dl_platform));
++
++  if (__sbrk (0) == &_end)
++    /* The dynamic linker was run as a program, and so the initial break
++       starts just after our bss, at &_end.  The malloc in dl-minimal.c
++       will consume the rest of this page, so tell the kernel to move the
++       break up that far.  When the user program examines its break, it
++       will see this new value and not clobber our data.  */
++    __sbrk (GLRO(dl_pagesize)
++	    - ((&_end - (void *) 0) & (GLRO(dl_pagesize) - 1)));
++
++  /* If this is a SUID program we make sure that FDs 0, 1, and 2 are
++     allocated.  If necessary we are doing it ourself.  If it is not
++     possible we stop the program.  */
++  if (__builtin_expect (INTUSE(__libc_enable_secure), 0))
++    __libc_check_standard_fds ();
++
++  (*dl_main) (phdr, phnum, &user_entry);
++  return user_entry;
++}
++
++void
++internal_function
++_dl_show_auxv (void)
++{
++  char buf[64];
++  ElfW(auxv_t) *av;
++
++  /* Terminate string.  */
++  buf[63] = '\0';
++
++  /* The following code assumes that the AT_* values are encoded
++     starting from 0 with AT_NULL, 1 for AT_IGNORE, and all other values
++     close by (otherwise the array will be too large).  In case we have
++     to support a platform where these requirements are not fulfilled
++     some alternative implementation has to be used.  */
++  for (av = _dl_auxv; av->a_type != AT_NULL; ++av)
++    {
++      static const struct
++      {
++	const char label[17];
++	enum { unknown = 0, dec, hex, str, ignore } form : 8;
++      } auxvars[] =
++	{
++	  [AT_EXECFD - 2] =		{ "EXECFD:       ", dec },
++	  [AT_PHDR - 2] =		{ "PHDR:         0x", hex },
++	  [AT_PHENT - 2] =		{ "PHENT:        ", dec },
++	  [AT_PHNUM - 2] =		{ "PHNUM:        ", dec },
++	  [AT_PAGESZ - 2] =		{ "PAGESZ:       ", dec },
++	  [AT_BASE - 2] =		{ "BASE:         0x", hex },
++	  [AT_FLAGS - 2] =		{ "FLAGS:        0x", hex },
++	  [AT_ENTRY - 2] =		{ "ENTRY:        0x", hex },
++#ifndef __powerpc__
++	  /* For some odd reason these are not in sys/powerpc/include/elf.h.  */
++	  [AT_NOTELF - 2] =		{ "NOTELF:       ", hex },
++	  [AT_UID - 2] =		{ "UID:          ", dec },
++	  [AT_EUID - 2] =		{ "EUID:         ", dec },
++	  [AT_GID - 2] =		{ "GID:          ", dec },
++	  [AT_EGID - 2] =		{ "EGID:         ", dec },
++#endif
++	  [AT_EXECPATH - 2] =		{ "EXECPATH      ", str },
++	  [AT_CANARY - 2] =		{ "CANARY:       0x", hex },
++	  [AT_CANARYLEN - 2] =		{ "CANARYLEN:    ", dec },
++	  [AT_OSRELDATE - 2] =		{ "OSRELDATE:    ", dec },
++	  [AT_NCPUS - 2] =		{ "NCPUS:        ", dec },
++	  [AT_PAGESIZES - 2] =		{ "PAGESIZES:    0x", hex },
++	  [AT_PAGESIZESLEN - 2] =	{ "PAGESIZESLEN: ", dec },
++	  [AT_STACKPROT - 2] =		{ "STACKPROT:    0x", hex },
++	};
++      unsigned int idx = (unsigned int) (av->a_type - 2);
++
++      if ((unsigned int) av->a_type < 2u || auxvars[idx].form == ignore)
++	continue;
++
++      assert (AT_NULL == 0);
++      assert (AT_IGNORE == 1);
++
++      if (idx < sizeof (auxvars) / sizeof (auxvars[0])
++	  && auxvars[idx].form != unknown)
++	{
++	  const char *val = (char *) av->a_un.a_val;
++
++	  if (__builtin_expect (auxvars[idx].form, dec) == dec)
++	    val = _itoa ((unsigned long int) av->a_un.a_val,
++			 buf + sizeof buf - 1, 10, 0);
++	  else if (__builtin_expect (auxvars[idx].form, hex) == hex)
++	    val = _itoa ((unsigned long int) av->a_un.a_val,
++			 buf + sizeof buf - 1, 16, 0);
++
++	  _dl_printf ("AT_%s%s\n", auxvars[idx].label, val);
++
++	  continue;
++	}
++
++      /* Unknown value: print a generic line.  */
++      char buf2[17];
++      buf2[sizeof (buf2) - 1] = '\0';
++      const char *val2 = _itoa ((unsigned long int) av->a_un.a_val,
++				buf2 + sizeof buf2 - 1, 16, 0);
++      const char *val =  _itoa ((unsigned long int) av->a_type,
++				buf + sizeof buf - 1, 16, 0);
++      _dl_printf ("AT_??? (0x%s): 0x%s\n", val, val2);
++    }
++}
++#endif
++
 +int
 +attribute_hidden
 +_dl_discover_osversion (void)
@@ -14132,8 +14446,8 @@
 +    {
 +      size_t new_allocated =
 +	(l->c_len + n < 2 * l->c_allocated + 1
-+	 ? l->c_len + n
-+	 : 2 * l->c_allocated + 1);
++	 ? 2 * l->c_allocated + 1
++	 : l->c_len + n);
 +      char *new_array = (char *) realloc (l->c_array, new_allocated);
 +      if (new_array == NULL)
 +	{
@@ -22341,7 +22655,7 @@
 +#endif
 --- /dev/null
 +++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/sys/rfork.h
-@@ -0,0 +1,91 @@
+@@ -0,0 +1,98 @@
 +/* Copyright (C) 2002 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
 +
@@ -22415,6 +22729,13 @@
 +#define RFTHREAD	(1<<13)	/* enable kernel thread support */
 +#define RFSIGSHARE	(1<<14)	/* share signal handlers */
 +#define RFLINUXTHPN     (1<<16) /* do linux clone exit parent notification */
++#define	RFSTOPPED	(1<<17) /* leave child in a stopped state */
++#define	RFHIGHPID	(1<<18) /* use a pid higher than 10 (idleproc) */
++#define	RFTSIGZMB	(1<<19) /* select signal for exit parent notification */
++#define	RFTSIGSHIFT	20      /* selected signal number is in bits 20-27  */
++#define	RFTSIGMASK	0xFF
++#define	RFTSIGNUM(flags)	(((flags) >> RFTSIGSHIFT) & RFTSIGMASK)
++#define	RFTSIGFLAGS(signum)	((signum) << RFTSIGSHIFT)
 +#define RFPPWAIT	(1<<31) /* parent sleeps until child exits (vfork) */
 +
 +#define RFTHPNSHIFT	24	/* reserve bits 24-30 */
Index: submitted-resolv.conf-thread.diff
===================================================================
--- submitted-resolv.conf-thread.diff	(révision 4469)
+++ submitted-resolv.conf-thread.diff	(copie de travail)
@@ -1,3 +1,8 @@
+2011-06-23  Paul Pluzhnikov  <ppluzhnikov@google.com>
+
+	* resolv/res_libc.c (__res_initstamp): Declare unconditionally.
+	(__res_maybe_init): Avoid double-checked locking.
+
 2010-09-15  Aurelien Jarno  <aurelien@aurel32.net>
  
 	* resolv/res_libc (__res_maybe_init): Ask other threads to
@@ -6,6 +11,22 @@
 
 --- a/resolv/res_libc.c
 +++ b/resolv/res_libc.c
+@@ -28,6 +28,7 @@
+    out) since res_init() should go into libc.so but the rest of that
+    file should not.  */
+ 
++__libc_lock_define_initialized (static, lock);
+ extern unsigned long long int __res_initstamp attribute_hidden;
+ /* We have atomic increment operations on 64-bit platforms.  */
+ #if __WORDSIZE == 64
+@@ -35,7 +36,6 @@
+ # define atomicincunlock(lock) (void) 0
+ # define atomicinc(var) catomic_increment (&(var))
+ #else
+-__libc_lock_define_initialized (static, lock);
+ # define atomicinclock(lock) __libc_lock_lock (lock)
+ # define atomicincunlock(lock) __libc_lock_unlock (lock)
+ # define atomicinc(var) ++var
 @@ -100,10 +100,13 @@
  
  	if (resp->options & RES_INIT) {
@@ -14,12 +35,12 @@
 -		    || ((ret == 0) && (last_mtime != statbuf.st_mtime))) {
 -			if (ret == 0)
 -				last_mtime = statbuf.st_mtime;
++		__libc_lock_lock (lock);
 +		if ((ret == 0) && (last_mtime != statbuf.st_mtime)) {
 +			last_mtime = statbuf.st_mtime;
-+			atomicinclock (lock);
 +			atomicinc (__res_initstamp);
-+			atomicincunlock (lock);
 +		}
++		__libc_lock_unlock (lock);
 +		if (__res_initstamp != resp->_u._ext.initstamp) {
  			if (resp->nscount > 0)
  				__res_iclose (resp, true);
2011-06-15  Ulrich Drepper  <drepper@gmail.com>

	* resolv/res_send.c (__libc_res_nsend): Fix typos in last patch.  We
	need to dereference resplen2.

2011-05-30  Ulrich Drepper  <drepper@gmail.com>
 
	[BZ #12684]
	* resolv/res_send.c (__libc_res_nsend): Only go to the next name server
	if both request failed.
	(send_dg): In case of server errors clear resplen or *resplen2.

---
 resolv/res_send.c |   12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -546,7 +546,7 @@
 				    ns, ansp, ansp2, nansp2, resplen2);
 			if (n < 0)
 				return (-1);
-			if (n == 0)
+			if (n == 0 && (buf2 == NULL || *resplen2 == 0))
 				goto next_ns;
 		} else {
 			/* Use datagrams. */
@@ -556,7 +556,7 @@
 				    ansp2, nansp2, resplen2);
 			if (n < 0)
 				return (-1);
-			if (n == 0)
+			if (n == 0 && (buf2 == NULL || *resplen2 == 0))
 				goto next_ns;
 			if (v_circuit)
 			  // XXX Check whether both requests failed or
@@ -1279,10 +1279,14 @@
 				(*thisresplen > *thisanssiz)
 				? *thisanssiz : *thisresplen);
 
-			if (recvresp1 || (buf2 != NULL && recvresp2))
+			if (recvresp1 || (buf2 != NULL && recvresp2)) {
+			  *resplen2 = 0;
 			  return resplen;
+			}
 			if (buf2 != NULL)
 			  {
+			    /* No data from the first reply.  */
+			    resplen = 0;
 			    /* We are waiting for a possible second reply.  */
 			    if (hp->id == anhp->id)
 			      recvresp1 = 1;
2011-07-21  Aurelien Jarno  <aurel32@debian.org>

	* resolv/res_query.c(__libc_res_nquery): Assign hp and hp2 
	depending n and resplen2 to catch cases where answer 
	equals answerp2.

diff --git a/resolv/res_query.c b/resolv/res_query.c
index 2f7cfaa..405fa68 100644
--- a/resolv/res_query.c
+++ b/resolv/res_query.c
@@ -122,6 +122,7 @@ __libc_res_nquery(res_state statp,
 		  int *resplen2)
 {
 	HEADER *hp = (HEADER *) answer;
+	HEADER *hp2;
 	int n, use_malloc = 0;
 	u_int oflags = statp->_flags;
 
@@ -239,26 +240,25 @@ __libc_res_nquery(res_state statp,
 	  /* __libc_res_nsend might have reallocated the buffer.  */
 	  hp = (HEADER *) *answerp;
 
-	/* We simplify the following tests by assigning HP to HP2.  It
-	   is easy to verify that this is the same as ignoring all
-	   tests of HP2.  */
-	HEADER *hp2 = answerp2 ? (HEADER *) *answerp2 : hp;
-
-	if (n < (int) sizeof (HEADER) && answerp2 != NULL
-	    && *resplen2 > (int) sizeof (HEADER))
+	/* We simplify the following tests by assigning HP to HP2 or
+	   vice versa.  It is easy to verify that this is the same as
+	   ignoring all tests of HP or HP2.  */
+	if (answerp2 == NULL || *resplen2 < (int) sizeof (HEADER))
 	  {
-	    /* Special case of partial answer.  */
-	    assert (hp != hp2);
-	    hp = hp2;
+	    hp2 = hp;
 	  }
-	else if (answerp2 != NULL && *resplen2 < (int) sizeof (HEADER)
-		 && n > (int) sizeof (HEADER))
+	else
 	  {
-	    /* Special case of partial answer.  */
-	    assert (hp != hp2);
-	    hp2 = hp;
+	    hp2 = (HEADER *) *answerp2;
+	    if (n < (int) sizeof (HEADER))
+	      {
+	        hp = hp2;
+	      }
 	  }
 
+	/* Make sure both hp and hp2 are defined */
+	assert((hp != NULL) && (hp2 != NULL));
+
 	if ((hp->rcode != NOERROR || ntohs(hp->ancount) == 0)
 	    && (hp2->rcode != NOERROR || ntohs(hp2->ancount) == 0)) {
 #ifdef DEBUG
2011-06-27  Ulrich Drepper  <drepper@gmail.com>
 
	[BZ #12350]
	* nscd/aicache.c (addhstaiX):  Restore only RES_USE_INET6
	bit from old_res_options.

2011-05-29  Ulrich Drepper  <drepper@gmail.com>
 
	[BZ #12350]
	* sysdeps/posix/getaddrinfo.c (gethosts): Restore only RES_USE_IENT6
	bit from old_res_options.
	(gaih_inet): Likewise.

diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 5ddda88..1e017b2 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -207,7 +207,7 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp,
       if (herrno == NETDB_INTERNAL)					      \
 	{								      \
 	  __set_h_errno (herrno);					      \
-	  _res.options = old_res_options;				      \
+	  _res.options |= old_res_options & RES_USE_INET6;		      \
 	  return -EAI_SYSTEM;						      \
 	}								      \
       if (herrno == TRY_AGAIN)						      \
@@ -1015,7 +1015,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
 		nip = nip->next;
 	    }
 
-	  _res.options = old_res_options;
+	  _res.options |= old_res_options & RES_USE_INET6;
 
 	  if (no_data != 0 && no_inet6_data != 0)
 	    {
diff --git a/nscd/aicache.c b/nscd/aicache.c
index 3190a13..6c8d83a 100644
--- a/nscd/aicache.c
+++ b/nscd/aicache.c
@@ -534,7 +534,7 @@ next_nip:
    }
 
  out:
-  _res.options = old_res_options;
+  _res.options |= old_res_options & RES_USE_INET6;
 
   if (dataset != NULL && !alloca_used)
     {
2011-01-14  Ulrich Drepper  <drepper@gmail.com>
 
	[BZ #10563]
	* sysdeps/unix/sysv/linux/i386/setgroups.c: Use INLINE_SETXID_SYSCALL
	to make the syscall.
	* sysdeps/unix/sysv/linux/setgroups.c: New file.
	* nptl/sysdeps/pthread/setxid.h (__SETXID_1): Add cast to assignment.
	(__SETXID_2): Likewise.
	(__SETXID_3): Likewise.

diff --git a/nptl/sysdeps/pthread/setxid.h b/nptl/sysdeps/pthread/setxid.h
index aebdbd2..043ffd2 100644
--- a/nptl/sysdeps/pthread/setxid.h
+++ b/nptl/sysdeps/pthread/setxid.h
@@ -20,11 +20,11 @@
 #include <sysdep.h>
 
 #define __SETXID_1(cmd, arg1) \
-  cmd.id[0] = arg1
+  cmd.id[0] = (long int) arg1
 #define __SETXID_2(cmd, arg1, arg2) \
-  __SETXID_1 (cmd, arg1); cmd.id[1] = arg2
+  __SETXID_1 (cmd, arg1); cmd.id[1] = (long int) arg2
 #define __SETXID_3(cmd, arg1, arg2, arg3) \
-  __SETXID_2 (cmd, arg1, arg2); cmd.id[2] = arg3
+  __SETXID_2 (cmd, arg1, arg2); cmd.id[2] = (long int) arg3
 
 #ifdef SINGLE_THREAD
 # define INLINE_SETXID_SYSCALL(name, nr, args...) \
diff --git a/sysdeps/unix/sysv/linux/i386/setgroups.c b/sysdeps/unix/sysv/linux/i386/setgroups.c
index 10f5b7c..42f7702 100644
--- a/sysdeps/unix/sysv/linux/i386/setgroups.c
+++ b/sysdeps/unix/sysv/linux/i386/setgroups.c
@@ -25,6 +26,7 @@
 #include <sys/syscall.h>
 #include <bp-checks.h>
 
+#include <setxid.h>
 #include <linux/posix_types.h>
 #include <kernel-features.h>
 
@@ -44,7 +46,7 @@ int
 setgroups (size_t n, const gid_t *groups)
 {
 #if __ASSUME_32BITUIDS > 0
-  return INLINE_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
+  return INLINE_SETXID_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
 #else
   if (n > (size_t) __sysconf (_SC_NGROUPS_MAX))
     {
@@ -62,7 +64,8 @@ setgroups (size_t n, const gid_t *groups)
 	  int result;
 	  int saved_errno = errno;
 
-	  result = INLINE_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
+	  result = INLINE_SETXID_SYSCALL (setgroups32, 2, n,
+					  CHECK_N (groups, n));
 	  if (result == 0 || errno != ENOSYS)
 	    return result;
 
@@ -80,7 +83,8 @@ setgroups (size_t n, const gid_t *groups)
 	    }
 	}
 
-      return INLINE_SYSCALL (setgroups, 2, n, CHECK_N (kernel_groups, n));
+      return INLINE_SETXID_SYSCALL (setgroups, 2, n,
+				    CHECK_N (kernel_groups, n));
     }
 #endif
 }
diff --git a/sysdeps/unix/sysv/linux/setgroups.c b/sysdeps/unix/sysv/linux/setgroups.c
new file mode 100644
index 0000000..9649974
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/setgroups.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1997,1998,2000,2002,2004,2006,2011
+   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.  */
+
+#include <errno.h>
+#include <grp.h>
+#include <setxid.h>
+#include <sysdep.h>
+
+
+/* Set the group set for the current user to GROUPS (N of them).  For
+   Linux we must convert the array of groups into the format that the
+   kernel expects.  */
+int
+setgroups (size_t n, const gid_t *groups)
+{
+#ifdef __NR_setgroups32
+# error "wrong setgroups.c file used"
+#endif
+  return INLINE_SETXID_SYSCALL (setgroups, 2, n, groups);
+}
+libc_hidden_def (setgroups)

Attachment: eglibc_2.11.2-10_2.11.3-1.diff.xz
Description: Binary data


Reply to: