fa3bfd
From 4fa8ae49aa169fb8d97882938e8bee3ed9ce5410 Mon Sep 17 00:00:00 2001
fa3bfd
From: DJ Delorie <dj@delorie.com>
fa3bfd
Date: Fri, 14 Jul 2017 21:46:42 -0400
fa3bfd
Subject: [PATCH] Fix BZ #21654 - grp-merge.c alignment
fa3bfd
fa3bfd
* grp/grp_merge.c (__copy_grp): Align char** to minimum pointer
fa3bfd
alignment not char alignment.
fa3bfd
(__merge_grp): Likewise.
fa3bfd
---
fa3bfd
 ChangeLog       |  7 +++++++
fa3bfd
 grp/grp-merge.c | 16 ++++++++++++++++
fa3bfd
 2 files changed, 23 insertions(+)
fa3bfd
fa3bfd
diff --git a/grp/grp-merge.c b/grp/grp-merge.c
fa3bfd
index 77c494d..6590e5d 100644
fa3bfd
--- a/grp/grp-merge.c
fa3bfd
+++ b/grp/grp-merge.c
fa3bfd
@@ -85,6 +85,14 @@ __copy_grp (const struct group srcgrp, const size_t buflen,
fa3bfd
     }
fa3bfd
   members[i] = NULL;
fa3bfd
 
fa3bfd
+  /* Align for pointers.  We can't simply align C because we need to
fa3bfd
+     align destbuf[c].  */
fa3bfd
+  if ((((uintptr_t)destbuf + c) & (__alignof__(char **) - 1)) != 0)
fa3bfd
+    {
fa3bfd
+      uintptr_t mis_align = ((uintptr_t)destbuf + c) & (__alignof__(char **) - 1);
fa3bfd
+      c += __alignof__(char **) - mis_align;
fa3bfd
+    }
fa3bfd
+
fa3bfd
   /* Copy the pointers from the members array into the buffer and assign them
fa3bfd
      to the gr_mem member of destgrp.  */
fa3bfd
   destgrp->gr_mem = (char **) &destbuf[c];
fa3bfd
@@ -168,6 +176,14 @@ __merge_grp (struct group *savedgrp, char *savedbuf, char *savedend,
fa3bfd
   /* Add the NULL-terminator.  */
fa3bfd
   members[savedmemcount + memcount] = NULL;
fa3bfd
 
fa3bfd
+  /* Align for pointers.  We can't simply align C because we need to
fa3bfd
+     align savedbuf[c].  */
fa3bfd
+  if ((((uintptr_t)savedbuf + c) & (__alignof__(char **) - 1)) != 0)
fa3bfd
+    {
fa3bfd
+      uintptr_t mis_align = ((uintptr_t)savedbuf + c) & (__alignof__(char **) - 1);
fa3bfd
+      c += __alignof__(char **) - mis_align;
fa3bfd
+    }
fa3bfd
+
fa3bfd
   /* Copy the member array back into the buffer after the member list and free
fa3bfd
      the member array.  */
fa3bfd
   savedgrp->gr_mem = (char **) &savedbuf[c];
fa3bfd
-- 
fa3bfd
1.8.3.1
fa3bfd