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

r5855 - in glibc-package/branches/glibc-branch-wheezy/debian: . patches patches/mips



Author: aurel32
Date: 2013-12-03 14:12:27 +0000 (Tue, 03 Dec 2013)
New Revision: 5855

Added:
   glibc-package/branches/glibc-branch-wheezy/debian/patches/mips/cvs-prlimit64.diff
Modified:
   glibc-package/branches/glibc-branch-wheezy/debian/changelog
   glibc-package/branches/glibc-branch-wheezy/debian/patches/series
Log:
  * patches/mips/cvs-prlimit64.diff: patch from upstream to fix getrlimit64
    and setrlimit64 with recent 64-bit kernels (Closes: #665897).



Modified: glibc-package/branches/glibc-branch-wheezy/debian/changelog
===================================================================
--- glibc-package/branches/glibc-branch-wheezy/debian/changelog	2013-12-03 14:04:38 UTC (rev 5854)
+++ glibc-package/branches/glibc-branch-wheezy/debian/changelog	2013-12-03 14:12:27 UTC (rev 5855)
@@ -10,7 +10,9 @@
   * patches/any/cvs-findlocale-div-by-zero.diff: patch from upstream to fix
     a SIGFPE when locale-archive has been corrupted to all zeros (Closes:
     #718890, #730336).
-
+  * patches/mips/cvs-prlimit64.diff: patch from upstream to fix getrlimit64
+    and setrlimit64 with recent 64-bit kernels (Closes: #665897).
+    
   [ Petr Salinger ]
   * patches/kfreebsd/local-initgroups-order.diff: always put supplied extra
     gid as the first entry of group list in setgroups(). Closes: #699593.

Added: glibc-package/branches/glibc-branch-wheezy/debian/patches/mips/cvs-prlimit64.diff
===================================================================
--- glibc-package/branches/glibc-branch-wheezy/debian/patches/mips/cvs-prlimit64.diff	                        (rev 0)
+++ glibc-package/branches/glibc-branch-wheezy/debian/patches/mips/cvs-prlimit64.diff	2013-12-03 14:12:27 UTC (rev 5855)
@@ -0,0 +1,139 @@
+2013-11-27  Aurelien Jarno <aurelien@aurel32.net>
+
+	* sysdeps/unix/sysv/linux/mips/getrlimit64.c: On O32 and N32 ABIs,
+	include the generic getrlimit64 version as __internal_getrlimit64
+	and add a wrapper around it to convert the RLIM64_INFINITY constant
+	between the libc and the kernel version.
+	* sysdeps/unix/sysv/linux/mips/setrlimit64.c: Ditto with setrlimit64.
+
+diff --git a/ports/sysdeps/unix/sysv/linux/mips/getrlimit64.c b/ports/sysdeps/unix/sysv/linux/mips/getrlimit64.c
+new file mode 100644
+index 0000000..10a5495
+--- /dev/null
++++ b/ports/sysdeps/unix/sysv/linux/mips/getrlimit64.c
+@@ -0,0 +1,64 @@
++/* Copyright (C) 2013 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, see
++   <http://www.gnu.org/licenses/>.  */
++
++#include <sys/resource.h>
++
++#if _MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIN32
++
++# define getrlimit64 static __internal_getrlimit64
++# undef libc_hidden_def
++# define libc_hidden_def(name)
++# include <sysdeps/unix/sysv/linux/getrlimit64.c>
++# undef getrlimit64
++# undef libc_hidden_def
++# define libc_hidden_def(name) hidden_def (name)
++
++/* RLIM64_INFINITY was supposed to be a glibc convention rather than
++   anything seen by the kernel, but it ended being passed to the kernel
++   through the prlimit64 syscall.  Given that a lot of binaries with
++   the wrong constant value are in the wild, provide a wrapper function
++   fixing the value after the syscall.  */
++
++# define GLIBC_RLIM64_INFINITY		0x7fffffffffffffffULL
++# define KERNEL_RLIM64_INFINITY		0xffffffffffffffffULL
++
++int
++getrlimit64 (enum __rlimit_resource resource,
++	     struct rlimit64 *rlimits)
++{
++  struct rlimit64 krlimits;
++
++  if (__internal_getrlimit64 (resource, &krlimits) < 0)
++    return -1;
++
++  if (krlimits.rlim_cur == KERNEL_RLIM64_INFINITY)
++    rlimits->rlim_cur = GLIBC_RLIM64_INFINITY;
++  else
++    rlimits->rlim_cur = krlimits.rlim_cur;
++  if (krlimits.rlim_max == KERNEL_RLIM64_INFINITY)
++    rlimits->rlim_max = GLIBC_RLIM64_INFINITY;
++  else
++    rlimits->rlim_max = krlimits.rlim_max;
++
++  return 0;
++}
++
++libc_hidden_def (getrlimit64)
++
++#else /* !_ABI_O32 && !_ABI_N32 */
++# include <sysdeps/unix/sysv/linux/getrlimit64.c>
++#endif
+diff --git a/ports/sysdeps/unix/sysv/linux/mips/setrlimit64.c b/ports/sysdeps/unix/sysv/linux/mips/setrlimit64.c
+new file mode 100644
+index 0000000..8609f69
+--- /dev/null
++++ b/ports/sysdeps/unix/sysv/linux/mips/setrlimit64.c
+@@ -0,0 +1,55 @@
++/* Copyright (C) 2013 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, see
++   <http://www.gnu.org/licenses/>.  */
++
++#include <sys/resource.h>
++
++#if _MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIN32
++
++# define setrlimit64 static __internal_setrlimit64
++# include <sysdeps/unix/sysv/linux/setrlimit64.c>
++# undef setrlimit64
++
++/* RLIM64_INFINITY was supposed to be a glibc convention rather than
++   anything seen by the kernel, but it ended being passed to the kernel
++   through the prlimit64 syscall.  Given that a lot of binaries with
++   the wrong constant value are in the wild, provide a wrapper function
++   fixing the value before the syscall.  */
++
++# define GLIBC_RLIM64_INFINITY		0x7fffffffffffffffULL
++# define KERNEL_RLIM64_INFINITY		0xffffffffffffffffULL
++
++int
++setrlimit64 (enum __rlimit_resource resource,
++	     const struct rlimit64 *rlimits)
++{
++  struct rlimit64 krlimits;
++
++  if (rlimits->rlim_cur == GLIBC_RLIM64_INFINITY)
++    krlimits.rlim_cur = KERNEL_RLIM64_INFINITY;
++  else
++    krlimits.rlim_cur = rlimits->rlim_cur;
++  if (rlimits->rlim_max == GLIBC_RLIM64_INFINITY)
++    krlimits.rlim_max = KERNEL_RLIM64_INFINITY;
++  else
++    krlimits.rlim_max = rlimits->rlim_max;
++
++  return __internal_setrlimit64 (resource, &krlimits);
++}
++
++#else /* !_ABI_O32 && !_ABI_N32 */
++# include <sysdeps/unix/sysv/linux/setrlimit64.c>
++#endif

Modified: glibc-package/branches/glibc-branch-wheezy/debian/patches/series
===================================================================
--- glibc-package/branches/glibc-branch-wheezy/debian/patches/series	2013-12-03 14:04:38 UTC (rev 5854)
+++ glibc-package/branches/glibc-branch-wheezy/debian/patches/series	2013-12-03 14:12:27 UTC (rev 5855)
@@ -244,6 +244,7 @@
 mips/submitted-rld_map.diff
 mips/submitted-dl-platform.diff
 mips/cvs-dlopen-lazy.diff
+mips/cvs-prlimit64.diff
 
 powerpc/local-libgcc_eh-ld.so.diff
 


Reply to: