From 652e2261e7bcfa04f90b65a745535d79114bec3d Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 5 Sep 2013 00:12:14 +0200 Subject: [PATCH] eglibc: update to eglibc-2.18-23911 Signed-off-by: Stephan Raue --- packages/toolchain/devel/eglibc/build | 11 +- packages/toolchain/devel/eglibc/meta | 2 +- ...-ARM_Pass_dl_hwcap_to_IFUNC_resolver.patch | 25 ++ .../eglibc-readdir_r-CVE-2013-4237.patch | 281 ++++++++++++++++++ .../patches/eglibc-strstr-hackfix.patch | 14 + .../{mkpkg_eglibc-2.17 => mkpkg_eglibc-2.18} | 33 +- 6 files changed, 343 insertions(+), 23 deletions(-) create mode 100644 packages/toolchain/devel/eglibc/patches/eglibc-ARM_Pass_dl_hwcap_to_IFUNC_resolver.patch create mode 100644 packages/toolchain/devel/eglibc/patches/eglibc-readdir_r-CVE-2013-4237.patch create mode 100644 packages/toolchain/devel/eglibc/patches/eglibc-strstr-hackfix.patch rename tools/mkpkg/{mkpkg_eglibc-2.17 => mkpkg_eglibc-2.18} (60%) diff --git a/packages/toolchain/devel/eglibc/build b/packages/toolchain/devel/eglibc/build index 6676942592..ab0c705c6d 100755 --- a/packages/toolchain/devel/eglibc/build +++ b/packages/toolchain/devel/eglibc/build @@ -127,10 +127,10 @@ libc_cv_ssp=no libc_cv_ctors_header=yes EOF -cat >configparms <> configparms +echo "slibdir=/lib" >> configparms +echo "sbindir=/usr/bin" >> configparms +echo "rootsbindir=/usr/bin" >> configparms ../configure --host=$TARGET_NAME \ --build=$HOST_NAME \ @@ -152,7 +152,8 @@ EOF --enable-obsolete-rpc \ --disable-build-nscd \ --disable-nscd \ + --enable-lock-elision \ $DEBUG_CONFIG \ make -make install_root=$SYSROOT_PREFIX install +$MAKEINSTALL diff --git a/packages/toolchain/devel/eglibc/meta b/packages/toolchain/devel/eglibc/meta index a68f47f56a..82b6ba4471 100644 --- a/packages/toolchain/devel/eglibc/meta +++ b/packages/toolchain/devel/eglibc/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="eglibc" -PKG_VERSION="2.17-22321" +PKG_VERSION="2.18-23911" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/toolchain/devel/eglibc/patches/eglibc-ARM_Pass_dl_hwcap_to_IFUNC_resolver.patch b/packages/toolchain/devel/eglibc/patches/eglibc-ARM_Pass_dl_hwcap_to_IFUNC_resolver.patch new file mode 100644 index 0000000000..5a8d60fda4 --- /dev/null +++ b/packages/toolchain/devel/eglibc/patches/eglibc-ARM_Pass_dl_hwcap_to_IFUNC_resolver.patch @@ -0,0 +1,25 @@ +From: Carlos O'Donell +Date: Thu, 29 Aug 2013 04:17:33 +0000 (-0400) +Subject: ARM: Pass dl_hwcap to IFUNC resolver. +X-Git-Url: https://sourceware.org/git/?p=glibc.git;a=commitdiff_plain;h=d0721e703d222c01a9e8c329311c4fb01dac6972;hp=3a3092398356c90788479fa75524a491e9d860cd + +ARM: Pass dl_hwcap to IFUNC resolver. + +For REL relocs pass dl_hwcap to the IFUNC resolver +as is required by the IFUNC API (bug 15905). +--- + +diff --git a/ports/sysdeps/arm/dl-machine.h b/ports/sysdeps/arm/dl-machine.h +index d251527..85dba67 100644 +--- a/ports/sysdeps/arm/dl-machine.h ++++ b/ports/sysdeps/arm/dl-machine.h +@@ -503,7 +503,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, + break; + case R_ARM_IRELATIVE: + value = map->l_addr + *reloc_addr; +- value = ((Elf32_Addr (*) (void)) value) (); ++ value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); + *reloc_addr = value; + break; + #endif + diff --git a/packages/toolchain/devel/eglibc/patches/eglibc-readdir_r-CVE-2013-4237.patch b/packages/toolchain/devel/eglibc/patches/eglibc-readdir_r-CVE-2013-4237.patch new file mode 100644 index 0000000000..7277ca2296 --- /dev/null +++ b/packages/toolchain/devel/eglibc/patches/eglibc-readdir_r-CVE-2013-4237.patch @@ -0,0 +1,281 @@ +diff --git a/manual/conf.texi b/manual/conf.texi +index 7eb8b36..c720063 100644 +--- a/manual/conf.texi ++++ b/manual/conf.texi +@@ -1149,6 +1149,9 @@ typed ahead as input. @xref{I/O Queues}. + @deftypevr Macro int NAME_MAX + The uniform system limit (if any) for the length of a file name component, not + including the terminating null character. ++ ++@strong{Portability Note:} On some systems, @theglibc{} defines ++@code{NAME_MAX}, but does not actually enforce this limit. + @end deftypevr + + @comment limits.h +@@ -1157,6 +1160,9 @@ including the terminating null character. + The uniform system limit (if any) for the length of an entire file name (that + is, the argument given to system calls such as @code{open}), including the + terminating null character. ++ ++@strong{Portability Note:} @Theglibc{} does not enforce this limit ++even if @code{PATH_MAX} is defined. + @end deftypevr + + @cindex limits, pipe buffer size +@@ -1476,6 +1482,9 @@ Inquire about the value of @code{POSIX_REC_MIN_XFER_SIZE}. + Inquire about the value of @code{POSIX_REC_XFER_ALIGN}. + @end table + ++@strong{Portability Note:} On some systems, @theglibc{} does not ++enforce @code{_PC_NAME_MAX} or @code{_PC_PATH_MAX} limits. ++ + @node Utility Limits + @section Utility Program Capacity Limits + +diff --git a/manual/filesys.texi b/manual/filesys.texi +index 1df9cf2..814c210 100644 +--- a/manual/filesys.texi ++++ b/manual/filesys.texi +@@ -444,9 +444,9 @@ symbols are declared in the header file @file{dirent.h}. + @comment POSIX.1 + @deftypefun {struct dirent *} readdir (DIR *@var{dirstream}) + This function reads the next entry from the directory. It normally +-returns a pointer to a structure containing information about the file. +-This structure is statically allocated and can be rewritten by a +-subsequent call. ++returns a pointer to a structure containing information about the ++file. This structure is associated with the @var{dirstream} handle ++and can be rewritten by a subsequent call. + + @strong{Portability Note:} On some systems @code{readdir} may not + return entries for @file{.} and @file{..}, even though these are always +@@ -461,19 +461,61 @@ conditions are defined for this function: + The @var{dirstream} argument is not valid. + @end table + +-@code{readdir} is not thread safe. Multiple threads using +-@code{readdir} on the same @var{dirstream} may overwrite the return +-value. Use @code{readdir_r} when this is critical. ++To distinguish between an end-of-directory condition or an error, you ++must set @code{errno} to zero before calling @code{readdir}. To avoid ++entering an infinite loop, you should stop reading from the directory ++after the first error. ++ ++In POSIX.1-2008, @code{readdir} is not thread-safe. In @theglibc{} ++implementation, it is safe to call @code{readdir} concurrently on ++different @var{dirstream}s, but multiple threads accessing the same ++@var{dirstream} result in undefined behavior. @code{readdir_r} is a ++fully thread-safe alternative, but suffers from poor portability (see ++below). It is recommended that you use @code{readdir}, with external ++locking if multiple threads access the same @var{dirstream}. + @end deftypefun + + @comment dirent.h + @comment GNU + @deftypefun int readdir_r (DIR *@var{dirstream}, struct dirent *@var{entry}, struct dirent **@var{result}) +-This function is the reentrant version of @code{readdir}. Like +-@code{readdir} it returns the next entry from the directory. But to +-prevent conflicts between simultaneously running threads the result is +-not stored in statically allocated memory. Instead the argument +-@var{entry} points to a place to store the result. ++This function is a version of @code{readdir} which performs internal ++locking. Like @code{readdir} it returns the next entry from the ++directory. To prevent conflicts between simultaneously running ++threads the result is stored inside the @var{entry} object. ++ ++@strong{Portability Note:} It is recommended to use @code{readdir} ++instead of @code{readdir_r} for the following reasons: ++ ++@itemize @bullet ++@item ++On systems which do not define @code{NAME_MAX}, it may not be possible ++to use @code{readdir_r} safely because the caller does not specify the ++length of the buffer for the directory entry. ++ ++@item ++On some systems, @code{readdir_r} cannot read directory entries with ++very long names. If such a name is encountered, @theglibc{} ++implementation of @code{readdir_r} returns with an error code of ++@code{ENAMETOOLONG} after the final directory entry has been read. On ++other systems, @code{readdir_r} may return successfully, but the ++@code{d_name} member may not be NUL-terminated or may be truncated. ++ ++@item ++POSIX-1.2008 does not guarantee that @code{readdir} is thread-safe, ++even when access to the same @var{dirstream} is serialized. But in ++current implementations (including @theglibc{}), it is safe to call ++@code{readdir} concurrently on different @var{dirstream}s, so there is ++no need to use @code{readdir_r} in most multi-threaded programs. In ++the rare case that multiple threads need to read from the same ++@var{dirstream}, it is still better to use @code{readdir} and external ++synchronization. ++ ++@item ++It is expected that future versions of POSIX will obsolete ++@code{readdir_r} and mandate the level of thread safety for ++@code{readdir} which is provided by @theglibc{} and other ++implementations today. ++@end itemize + + Normally @code{readdir_r} returns zero and sets @code{*@var{result}} + to @var{entry}. If there are no more entries in the directory or an +@@ -481,15 +523,6 @@ error is detected, @code{readdir_r} sets @code{*@var{result}} to a + null pointer and returns a nonzero error code, also stored in + @code{errno}, as described for @code{readdir}. + +-@strong{Portability Note:} On some systems @code{readdir_r} may not +-return a NUL terminated string for the file name, even when there is no +-@code{d_reclen} field in @code{struct dirent} and the file +-name is the maximum allowed size. Modern systems all have the +-@code{d_reclen} field, and on old systems multi-threading is not +-critical. In any case there is no such problem with the @code{readdir} +-function, so that even on systems without the @code{d_reclen} member one +-could use multiple threads by using external locking. +- + It is also important to look at the definition of the @code{struct + dirent} type. Simply passing a pointer to an object of this type for + the second parameter of @code{readdir_r} might not be enough. Some +diff --git a/sysdeps/posix/dirstream.h b/sysdeps/posix/dirstream.h +index a7a074d..8e8570d 100644 +--- a/sysdeps/posix/dirstream.h ++++ b/sysdeps/posix/dirstream.h +@@ -39,6 +39,8 @@ struct __dirstream + + off_t filepos; /* Position of next entry to read. */ + ++ int errcode; /* Delayed error code. */ ++ + /* Directory block. */ + char data[0] __attribute__ ((aligned (__alignof__ (void*)))); + }; +diff --git a/sysdeps/posix/opendir.c b/sysdeps/posix/opendir.c +index ddfc3a7..fc05b0f 100644 +--- a/sysdeps/posix/opendir.c ++++ b/sysdeps/posix/opendir.c +@@ -231,6 +231,7 @@ __alloc_dir (int fd, bool close_fd, int flags, const struct stat64 *statp) + dirp->size = 0; + dirp->offset = 0; + dirp->filepos = 0; ++ dirp->errcode = 0; + + return dirp; + } +diff --git a/sysdeps/posix/readdir_r.c b/sysdeps/posix/readdir_r.c +index b5a8e2e..8ed5c3f 100644 +--- a/sysdeps/posix/readdir_r.c ++++ b/sysdeps/posix/readdir_r.c +@@ -40,6 +40,7 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) + DIRENT_TYPE *dp; + size_t reclen; + const int saved_errno = errno; ++ int ret; + + __libc_lock_lock (dirp->lock); + +@@ -70,10 +71,10 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) + bytes = 0; + __set_errno (saved_errno); + } ++ if (bytes < 0) ++ dirp->errcode = errno; + + dp = NULL; +- /* Reclen != 0 signals that an error occurred. */ +- reclen = bytes != 0; + break; + } + dirp->size = (size_t) bytes; +@@ -106,29 +107,46 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) + dirp->filepos += reclen; + #endif + +- /* Skip deleted files. */ ++#ifdef NAME_MAX ++ if (reclen > offsetof (DIRENT_TYPE, d_name) + NAME_MAX + 1) ++ { ++ /* The record is very long. It could still fit into the ++ caller-supplied buffer if we can skip padding at the ++ end. */ ++ size_t namelen = _D_EXACT_NAMLEN (dp); ++ if (namelen <= NAME_MAX) ++ reclen = offsetof (DIRENT_TYPE, d_name) + namelen + 1; ++ else ++ { ++ /* The name is too long. Ignore this file. */ ++ dirp->errcode = ENAMETOOLONG; ++ dp->d_ino = 0; ++ continue; ++ } ++ } ++#endif ++ ++ /* Skip deleted and ignored files. */ + } + while (dp->d_ino == 0); + + if (dp != NULL) + { +-#ifdef GETDENTS_64BIT_ALIGNED +- /* The d_reclen value might include padding which is not part of +- the DIRENT_TYPE data structure. */ +- reclen = MIN (reclen, +- offsetof (DIRENT_TYPE, d_name) + sizeof (dp->d_name)); +-#endif + *result = memcpy (entry, dp, reclen); +-#ifdef GETDENTS_64BIT_ALIGNED ++#ifdef _DIRENT_HAVE_D_RECLEN + entry->d_reclen = reclen; + #endif ++ ret = 0; + } + else +- *result = NULL; ++ { ++ *result = NULL; ++ ret = dirp->errcode; ++ } + + __libc_lock_unlock (dirp->lock); + +- return dp != NULL ? 0 : reclen ? errno : 0; ++ return ret; + } + + #ifdef __READDIR_R_ALIAS +diff --git a/sysdeps/posix/rewinddir.c b/sysdeps/posix/rewinddir.c +index 2935a8e..d4991ad 100644 +--- a/sysdeps/posix/rewinddir.c ++++ b/sysdeps/posix/rewinddir.c +@@ -33,6 +33,7 @@ rewinddir (dirp) + dirp->filepos = 0; + dirp->offset = 0; + dirp->size = 0; ++ dirp->errcode = 0; + #ifndef NOT_IN_libc + __libc_lock_unlock (dirp->lock); + #endif +diff --git a/sysdeps/unix/sysv/linux/i386/readdir64_r.c b/sysdeps/unix/sysv/linux/i386/readdir64_r.c +index 8ebbcfd..a7d114e 100644 +--- a/sysdeps/unix/sysv/linux/i386/readdir64_r.c ++++ b/sysdeps/unix/sysv/linux/i386/readdir64_r.c +@@ -18,7 +18,6 @@ + #define __READDIR_R __readdir64_r + #define __GETDENTS __getdents64 + #define DIRENT_TYPE struct dirent64 +-#define GETDENTS_64BIT_ALIGNED 1 + + #include + +diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c +index 5ed8e95..290f2c8 100644 +--- a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c ++++ b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c +@@ -1,5 +1,4 @@ + #define readdir64_r __no_readdir64_r_decl +-#define GETDENTS_64BIT_ALIGNED 1 + #include + #undef readdir64_r + weak_alias (__readdir_r, readdir64_r) +-- +1.8.3.4 + diff --git a/packages/toolchain/devel/eglibc/patches/eglibc-strstr-hackfix.patch b/packages/toolchain/devel/eglibc/patches/eglibc-strstr-hackfix.patch new file mode 100644 index 0000000000..d9519d95bf --- /dev/null +++ b/packages/toolchain/devel/eglibc/patches/eglibc-strstr-hackfix.patch @@ -0,0 +1,14 @@ +diff --git a/sysdeps/x86_64/multiarch/strstr.c b/sysdeps/x86_64/multiarch/strstr.c +index cd63b68..03d8b9a 100644 +--- a/sysdeps/x86_64/multiarch/strstr.c ++++ b/sysdeps/x86_64/multiarch/strstr.c +@@ -86,7 +86,7 @@ + /* Simple replacement of movdqu to address 4KB boundary cross issue. + If EOS occurs within less than 16B before 4KB boundary, we don't + cross to next page. */ +-static __m128i ++static inline __m128i + __m128i_strloadu (const unsigned char * p, __m128i zero) + { + if (__builtin_expect ((int) ((size_t) p & 0xfff) > 0xff0, 0)) + diff --git a/tools/mkpkg/mkpkg_eglibc-2.17 b/tools/mkpkg/mkpkg_eglibc-2.18 similarity index 60% rename from tools/mkpkg/mkpkg_eglibc-2.17 rename to tools/mkpkg/mkpkg_eglibc-2.18 index 71f06b971b..bd7a882961 100755 --- a/tools/mkpkg/mkpkg_eglibc-2.17 +++ b/tools/mkpkg/mkpkg_eglibc-2.18 @@ -20,48 +20,47 @@ ################################################################################ echo "getting sources..." - svn co svn://svn.eglibc.org/branches/eglibc-2_17/libc eglibc-2.17-latest - svn co svn://svn.eglibc.org/branches/eglibc-2_17/ports eglibc-2.17-latest/ports - svn co svn://svn.eglibc.org/branches/eglibc-2_17/linuxthreads/linuxthreads eglibc-2.17-latest/linuxthreads - svn co svn://svn.eglibc.org/branches/eglibc-2_17/linuxthreads/linuxthreads_db eglibc-2.17-latest/linuxthreads_db + svn co svn://svn.eglibc.org/branches/eglibc-2_18/libc eglibc-2.18-latest + svn co svn://svn.eglibc.org/branches/eglibc-2_18/linuxthreads/linuxthreads eglibc-2.18-latest/linuxthreads + svn co svn://svn.eglibc.org/branches/eglibc-2_18/linuxthreads/linuxthreads_db eglibc-2.18-latest/linuxthreads_db echo "getting version..." - cd eglibc-2.17-latest + cd eglibc-2.18-latest SVN_REV=`LANG=C svn info 2>/dev/null | grep Revision: | sed -e 's/.*\: //'` echo $SVN_REV cd .. echo "copying sources..." - rm -rf eglibc-2.17-$SVN_REV - cp -R eglibc-2.17-latest eglibc-2.17-$SVN_REV + rm -rf eglibc-2.18-$SVN_REV + cp -R eglibc-2.18-latest eglibc-2.18-$SVN_REV echo "cleaning sources..." - find eglibc-2.17-$SVN_REV -name .svn -exec rm -rf {} ";" + find eglibc-2.18-$SVN_REV -name .svn -exec rm -rf {} ";" echo "packing sources..." - tar cvJf eglibc-2.17-$SVN_REV.tar.xz eglibc-2.17-$SVN_REV + tar cvJf eglibc-2.18-$SVN_REV.tar.xz eglibc-2.18-$SVN_REV echo "remove temporary sourcedir..." - rm -rf eglibc-2.17-$SVN_REV + rm -rf eglibc-2.18-$SVN_REV # now localedef - svn co svn://svn.eglibc.org/branches/eglibc-2_17/localedef eglibc-localedef-2.17-latest + svn co svn://svn.eglibc.org/branches/eglibc-2_18/localedef eglibc-localedef-2.18-latest echo "getting version..." - cd eglibc-localedef-2.17-latest + cd eglibc-localedef-2.18-latest SVN_REV=`LANG=C svn info 2>/dev/null | grep Revision: | sed -e 's/.*\: //'` echo $SVN_REV cd .. echo "copying sources..." - rm -rf eglibc-localedef-2.17-$SVN_REV - cp -R eglibc-localedef-2.17-latest eglibc-localedef-2.17-$SVN_REV + rm -rf eglibc-localedef-2.18-$SVN_REV + cp -R eglibc-localedef-2.18-latest eglibc-localedef-2.18-$SVN_REV echo "cleaning sources..." - find eglibc-localedef-2.17-$SVN_REV -name .svn -exec rm -rf {} ";" + find eglibc-localedef-2.18-$SVN_REV -name .svn -exec rm -rf {} ";" echo "packing sources..." - tar cvJf eglibc-localedef-2.17-$SVN_REV.tar.xz eglibc-localedef-2.17-$SVN_REV + tar cvJf eglibc-localedef-2.18-$SVN_REV.tar.xz eglibc-localedef-2.18-$SVN_REV echo "remove temporary sourcedir..." - rm -rf eglibc-localedef-2.17-$SVN_REV + rm -rf eglibc-localedef-2.18-$SVN_REV