guix-commits
[Top][All Lists]
Advanced

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

01/10: gnu: glibc: Update to 2.28.


From: Marius Bakke
Subject: 01/10: gnu: glibc: Update to 2.28.
Date: Sat, 25 Aug 2018 10:30:53 -0400 (EDT)

mbakke pushed a commit to branch core-updates
in repository guix.

commit e13b547407b0db6c0f8205154ea43d6f99e8b186
Author: Marius Bakke <address@hidden>
Date:   Wed Aug 1 16:13:45 2018 +0200

    gnu: glibc: Update to 2.28.
    
    * gnu/packages/patches/glibc-2.28-git-fixes.patch: New file.
    * gnu/local.mk (dist_patch_DATA): Register it.
    * gnu/packages/base.scm (glibc/linux): Update to 2.28.
    [source](patches): Add 'glibc-2.28-git-fixes.patch'.  Remove 2.27 
equivalent.
    (glibc-2.28): Remove variable.
    (glibc-2.27): New public variable
---
 gnu/local.mk                                    |   1 +
 gnu/packages/base.scm                           |  28 +--
 gnu/packages/patches/glibc-2.28-git-fixes.patch | 248 ++++++++++++++++++++++++
 3 files changed, 263 insertions(+), 14 deletions(-)

diff --git a/gnu/local.mk b/gnu/local.mk
index e4a7c3d..d1228b9 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -740,6 +740,7 @@ dist_patch_DATA =                                           
\
   %D%/packages/patches/glibc-vectorized-strcspn-guards.patch   \
   %D%/packages/patches/glibc-versioned-locpath.patch           \
   %D%/packages/patches/glibc-2.27-git-fixes.patch              \
+  %D%/packages/patches/glibc-2.28-git-fixes.patch              \
   %D%/packages/patches/glusterfs-use-PATH-instead-of-hardcodes.patch           
\
   %D%/packages/patches/glog-gcc-5-demangling.patch             \
   %D%/packages/patches/gmp-arm-asm-nothumb.patch               \
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 572d64f..c073672 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -561,13 +561,13 @@ store.")
    (name "glibc")
    ;; Note: Always use a dot after the minor version since various places rely
    ;; on "version-major+minor" to determine where locales are found.
-   (version "2.27")
+   (version "2.28")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://gnu/glibc/glibc-" version ".tar.xz"))
             (sha256
              (base32
-              "0wpwq7gsm7sd6ysidv0z575ckqdg13cr2njyfgrbgh4f65adwwji"))
+              "10iha5ynvdj5m62vgpgqbq4cwvc2yhyl2w9yyyjgfxmdmx8h145i"))
             (snippet
              ;; Disable 'ldconfig' and /etc/ld.so.cache.  The latter is
              ;; required on LFS distros to avoid loading the distro's libc.so
@@ -579,7 +579,7 @@ store.")
                 #t))
             (modules '((guix build utils)))
             (patches (search-patches "glibc-ldd-x86_64.patch"
-                                     "glibc-2.27-git-fixes.patch"
+                                     "glibc-2.28-git-fixes.patch"
                                      "glibc-hidden-visibility-ldconfig.patch"
                                      "glibc-versioned-locpath.patch"
                                      "glibc-allow-kernel-2.6.32.patch"
@@ -862,25 +862,25 @@ GLIBC/HURD for a Hurd host"
 (define-syntax glibc
   (identifier-syntax (glibc-for-target)))
 
-;; The "next" libc.  Useful for populating locale data before reconfiguring the
-;; entire system on it.  Will be the default in the next rebuild cycle.
-(define-public glibc-2.28
+;; Below are old libc versions, which we use mostly to build locale data in
+;; the old format (which the new libc cannot cope with.)
+
+(define-public glibc-2.27
   (package
     (inherit glibc)
-    (version "2.28")
+    (version "2.27")
     (source (origin
               (inherit (package-source glibc))
               (uri (string-append "mirror://gnu/glibc/glibc-" version 
".tar.xz"))
               (sha256
                (base32
-                "10iha5ynvdj5m62vgpgqbq4cwvc2yhyl2w9yyyjgfxmdmx8h145i"))
-              (patches (search-patches "glibc-allow-kernel-2.6.32.patch"
-                                       "glibc-ldd-x86_64.patch"
+                "0wpwq7gsm7sd6ysidv0z575ckqdg13cr2njyfgrbgh4f65adwwji"))
+              (patches (search-patches "glibc-ldd-x86_64.patch"
+                                       "glibc-2.27-git-fixes.patch"
                                        "glibc-hidden-visibility-ldconfig.patch"
-                                       "glibc-versioned-locpath.patch"))))))
-
-;; Below are old libc versions, which we use mostly to build locale data in
-;; the old format (which the new libc cannot cope with.)
+                                       "glibc-versioned-locpath.patch"
+                                       "glibc-allow-kernel-2.6.32.patch"
+                                       
"glibc-reinstate-prlimit64-fallback.patch"))))))
 
 (define-public glibc-2.26
   (package
diff --git a/gnu/packages/patches/glibc-2.28-git-fixes.patch 
b/gnu/packages/patches/glibc-2.28-git-fixes.patch
new file mode 100644
index 0000000..7e370ef
--- /dev/null
+++ b/gnu/packages/patches/glibc-2.28-git-fixes.patch
@@ -0,0 +1,248 @@
+This file contains fixes from the "release/2.28/master" branch:
+https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/release/2.28/master
+
+Currently we have these commits (sans tests and ChangeLog updates):
+7f11842e7483da7aa9fa3031be122021978ef600
+726e1554ce4db5e35af41cb0110c54c5e1232054
+4b25485f03158959cff45379eecc1d73c7dcdd11
+d05b05d1570ba3ae354a2f5a3cfeefb373b09979
+bfcfa22589f2b4277a65e60c6b736b6bbfbd87d0
+2f498f3d140ab5152bd784df2be7af7d9c5e63ed
+
+diff --git a/htl/Versions b/htl/Versions
+index 6a63a1b8a1..c5a616da10 100644
+--- a/htl/Versions
++++ b/htl/Versions
+@@ -150,6 +150,8 @@ libpthread {
+     __cthread_keycreate;
+     __cthread_getspecific;
+     __cthread_setspecific;
++    __pthread_getspecific;
++    __pthread_setspecific;
+     __pthread_getattr_np;
+     __pthread_attr_getstack;
+   }
+
+diff --git a/sysdeps/htl/pt-getspecific.c b/sysdeps/htl/pt-getspecific.c
+index a0227a67f6..64ddf9551a 100644
+--- a/sysdeps/htl/pt-getspecific.c
++++ b/sysdeps/htl/pt-getspecific.c
+@@ -36,3 +36,4 @@ __pthread_getspecific (pthread_key_t key)
+   return self->thread_specifics[key];
+ }
+ strong_alias (__pthread_getspecific, pthread_getspecific);
++hidden_def (__pthread_getspecific)
+diff --git a/sysdeps/htl/pt-setspecific.c b/sysdeps/htl/pt-setspecific.c
+index a46a12f157..02aff417ef 100644
+--- a/sysdeps/htl/pt-setspecific.c
++++ b/sysdeps/htl/pt-setspecific.c
+@@ -48,3 +48,4 @@ __pthread_setspecific (pthread_key_t key, const void *value)
+   return 0;
+ }
+ strong_alias (__pthread_setspecific, pthread_setspecific);
++hidden_def (__pthread_setspecific)
+diff --git a/sysdeps/htl/pthreadP.h b/sysdeps/htl/pthreadP.h
+index 132ac1718e..71c2fcd9c6 100644
+--- a/sysdeps/htl/pthreadP.h
++++ b/sysdeps/htl/pthreadP.h
+@@ -68,6 +68,8 @@ struct __pthread_cancelation_handler 
**___pthread_get_cleanup_stack (void) attri
+ 
+ #if IS_IN (libpthread)
+ hidden_proto (__pthread_key_create)
++hidden_proto (__pthread_getspecific)
++hidden_proto (__pthread_setspecific)
+ hidden_proto (_pthread_mutex_init)
+ #endif
+ 
+diff --git a/sysdeps/unix/sysv/linux/getdents64.c 
b/sysdeps/unix/sysv/linux/getdents64.c
+index 3bde0cf4f0..bc140b5a7f 100644
+--- a/sysdeps/unix/sysv/linux/getdents64.c
++++ b/sysdeps/unix/sysv/linux/getdents64.c
+@@ -33,41 +33,80 @@ strong_alias (__getdents64, __getdents)
+ # include <shlib-compat.h>
+ 
+ # if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
+-# include <olddirent.h>
++#  include <olddirent.h>
++#  include <unistd.h>
+ 
+-/* kernel definition of as of 3.2.  */
+-struct compat_linux_dirent
++static ssize_t
++handle_overflow (int fd, __off64_t offset, ssize_t count)
+ {
+-  /* Both d_ino and d_off are compat_ulong_t which are defined in all
+-     architectures as 'u32'.  */
+-  uint32_t        d_ino;
+-  uint32_t        d_off;
+-  unsigned short  d_reclen;
+-  char            d_name[1];
+-};
++  /* If this is the first entry in the buffer, we can report the
++     error.  */
++  if (count == 0)
++    {
++      __set_errno (EOVERFLOW);
++      return -1;
++    }
++
++  /* Otherwise, seek to the overflowing entry, so that the next call
++     will report the error, and return the data read so far..  */
++  if (__lseek64 (fd, offset, SEEK_SET) != 0)
++    return -1;
++  return count;
++}
+ 
+ ssize_t
+ __old_getdents64 (int fd, char *buf, size_t nbytes)
+ {
+-  ssize_t retval = INLINE_SYSCALL_CALL (getdents, fd, buf, nbytes);
++  /* We do not move the individual directory entries.  This is only
++     possible if the target type (struct __old_dirent64) is smaller
++     than the source type.  */
++  _Static_assert (offsetof (struct __old_dirent64, d_name)
++                <= offsetof (struct dirent64, d_name),
++                "__old_dirent64 is larger than dirent64");
++  _Static_assert (__alignof__ (struct __old_dirent64)
++                <= __alignof__ (struct dirent64),
++                "alignment of __old_dirent64 is larger than dirent64");
+ 
+-  /* The kernel added the d_type value after the name.  Change this now.  */
+-  if (retval != -1)
++  ssize_t retval = INLINE_SYSCALL_CALL (getdents64, fd, buf, nbytes);
++  if (retval > 0)
+     {
+-      union
+-      {
+-      struct compat_linux_dirent k;
+-      struct dirent u;
+-      } *kbuf = (void *) buf;
+-
+-      while ((char *) kbuf < buf + retval)
++      char *p = buf;
++      char *end = buf + retval;
++      while (p < end)
+       {
+-        char d_type = *((char *) kbuf + kbuf->k.d_reclen - 1);
+-        memmove (kbuf->u.d_name, kbuf->k.d_name,
+-                 strlen (kbuf->k.d_name) + 1);
+-        kbuf->u.d_type = d_type;
++        struct dirent64 *source = (struct dirent64 *) p;
++
++        /* Copy out the fixed-size data.  */
++        __ino_t ino = source->d_ino;
++        __off64_t offset = source->d_off;
++        unsigned int reclen = source->d_reclen;
++        unsigned char type = source->d_type;
++
++        /* Check for ino_t overflow.  */
++        if (__glibc_unlikely (ino != source->d_ino))
++          return handle_overflow (fd, offset, p - buf);
++
++        /* Convert to the target layout.  Use a separate struct and
++           memcpy to side-step aliasing issues.  */
++        struct __old_dirent64 result;
++        result.d_ino = ino;
++        result.d_off = offset;
++        result.d_reclen = reclen;
++        result.d_type = type;
++
++        /* Write the fixed-sized part of the result to the
++           buffer.  */
++        size_t result_name_offset = offsetof (struct __old_dirent64, d_name);
++        memcpy (p, &result, result_name_offset);
++
++        /* Adjust the position of the name if necessary.  Copy
++           everything until the end of the record, including the
++           terminating NUL byte.  */
++        if (result_name_offset != offsetof (struct dirent64, d_name))
++          memmove (p + result_name_offset, source->d_name,
++                   reclen - offsetof (struct dirent64, d_name));
+ 
+-        kbuf = (void *) ((char *) kbuf + kbuf->k.d_reclen);
++        p += reclen;
+       }
+      }
+   return retval;
+
+diff --git a/misc/error.c b/misc/error.c
+index b4e8b6c938..03378e2f2a 100644
+--- a/misc/error.c
++++ b/misc/error.c
+@@ -319,6 +319,7 @@ error (int status, int errnum, const char *message, ...)
+ 
+   va_start (args, message);
+   error_tail (status, errnum, message, args);
++  va_end (args);
+ 
+ #ifdef _LIBC
+   _IO_funlockfile (stderr);
+@@ -390,6 +391,7 @@ error_at_line (int status, int errnum, const char 
*file_name,
+ 
+   va_start (args, message);
+   error_tail (status, errnum, message, args);
++  va_end (args);
+ 
+ #ifdef _LIBC
+   _IO_funlockfile (stderr);
+
+diff --git a/nscd/nscd_conf.c b/nscd/nscd_conf.c
+index 265a02434d..7293b795b6 100644
+--- a/nscd/nscd_conf.c
++++ b/nscd/nscd_conf.c
+@@ -190,7 +190,10 @@ nscd_parse_file (const char *fname, struct database_dyn 
dbs[lastdb])
+         if (!arg1)
+           error (0, 0, _("Must specify user name for server-user option"));
+         else
+-          server_user = xstrdup (arg1);
++          {
++            free ((char *) server_user);
++            server_user = xstrdup (arg1);
++          }
+       }
+       else if (strcmp (entry, "stat-user") == 0)
+       {
+@@ -198,6 +201,7 @@ nscd_parse_file (const char *fname, struct database_dyn 
dbs[lastdb])
+           error (0, 0, _("Must specify user name for stat-user option"));
+         else
+           {
++            free ((char *) stat_user);
+             stat_user = xstrdup (arg1);
+ 
+             struct passwd *pw = getpwnam (stat_user);
+
+diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
+index cfd34b66b9..35b0bfc5d2 100644
+--- a/nss/nss_files/files-alias.c
++++ b/nss/nss_files/files-alias.c
+@@ -221,6 +221,13 @@ get_next_alias (FILE *stream, const char *match, struct 
aliasent *result,
+                       {
+                         while (! feof_unlocked (listfile))
+                           {
++                            if (room_left < 2)
++                              {
++                                free (old_line);
++                                fclose (listfile);
++                                goto no_more_room;
++                              }
++
+                             first_unused[room_left - 1] = '\xff';
+                             line = fgets_unlocked (first_unused, room_left,
+                                                    listfile);
+@@ -229,6 +236,7 @@ get_next_alias (FILE *stream, const char *match, struct 
aliasent *result,
+                             if (first_unused[room_left - 1] != '\xff')
+                               {
+                                 free (old_line);
++                                fclose (listfile);
+                                 goto no_more_room;
+                               }
+ 
+@@ -256,6 +264,7 @@ get_next_alias (FILE *stream, const char *match, struct 
aliasent *result,
+                                                      + __alignof__ (char *)))
+                                       {
+                                         free (old_line);
++                                        fclose (listfile);
+                                         goto no_more_room;
+                                       }
+                                     room_left -= ((first_unused - cp)
+



reply via email to

[Prev in Thread] Current Thread [Next in Thread]