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.
This commit is contained in:
DJ Delorie 2017-07-14 21:46:42 -04:00
parent de895ddcd7
commit 4fa8ae49aa
2 changed files with 23 additions and 0 deletions

View File

@ -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-07-14 Szabolcs Nagy <szabolcs.nagy@arm.com>
Florian Weimer <fweimer@redhat.com>

View File

@ -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];