aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDJ Delorie <dj@delorie.com>2017-07-14 21:46:42 -0400
committerFlorian Weimer <fweimer@redhat.com>2017-10-07 13:30:00 +0200
commitcaa97d7a46db35a5ddb7bc53e56a866bc180c3b0 (patch)
tree1063b14aa7765512cba2494e08129ec07132f65d
parentd5a4092c367955ac0203ee603fdec625f6c924f9 (diff)
downloadglibc-caa97d7a46db35a5ddb7bc53e56a866bc180c3b0.tar
glibc-caa97d7a46db35a5ddb7bc53e56a866bc180c3b0.tar.gz
glibc-caa97d7a46db35a5ddb7bc53e56a866bc180c3b0.tar.bz2
glibc-caa97d7a46db35a5ddb7bc53e56a866bc180c3b0.zip
Fix BZ #21654 - grp-merge.c alignment
* grp/grp_merge.c (__copy_grp): Align char** to minimum pointer alignment not char alignment. (__merge_grp): Likewise. (cherry picked from commit 4fa8ae49aa169fb8d97882938e8bee3ed9ce5410)
-rw-r--r--ChangeLog7
-rw-r--r--grp/grp-merge.c16
2 files changed, 23 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ecc0da0b02..fe5103f03e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-07-14 DJ Delorie <dj@redhat.com>
+
+ [BZ #21654]
+ * grp/grp_merge.c (__copy_grp): Align char** to minimum pointer
+ alignment not char alignment.
+ (__merge_grp): Likewise.
+
2017-08-06 H.J. Lu <hongjiu.lu@intel.com>
[BZ #21871]
diff --git a/grp/grp-merge.c b/grp/grp-merge.c
index 0a1eb38d2c..50573b8986 100644
--- a/grp/grp-merge.c
+++ b/grp/grp-merge.c
@@ -85,6 +85,14 @@ __copy_grp (const struct group srcgrp, const size_t buflen,
}
members[i] = NULL;
+ /* Align for pointers. We can't simply align C because we need to
+ align destbuf[c]. */
+ if ((((uintptr_t)destbuf + c) & (__alignof__(char **) - 1)) != 0)
+ {
+ uintptr_t mis_align = ((uintptr_t)destbuf + c) & (__alignof__(char **) - 1);
+ c += __alignof__(char **) - mis_align;
+ }
+
/* Copy the pointers from the members array into the buffer and assign them
to the gr_mem member of destgrp. */
destgrp->gr_mem = (char **) &destbuf[c];
@@ -168,6 +176,14 @@ __merge_grp (struct group *savedgrp, char *savedbuf, char *savedend,
/* Add the NULL-terminator. */
members[savedmemcount + memcount] = NULL;
+ /* Align for pointers. We can't simply align C because we need to
+ align savedbuf[c]. */
+ if ((((uintptr_t)savedbuf + c) & (__alignof__(char **) - 1)) != 0)
+ {
+ uintptr_t mis_align = ((uintptr_t)savedbuf + c) & (__alignof__(char **) - 1);
+ c += __alignof__(char **) - mis_align;
+ }
+
/* Copy the member array back into the buffer after the member list and free
the member array. */
savedgrp->gr_mem = (char **) &savedbuf[c];