This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: grp/grp_merge.c alignment fix
- From: Carlos O'Donell <carlos at redhat dot com>
- To: DJ Delorie <dj at redhat dot com>
- Cc: libc-alpha at sourceware dot org
- Date: Fri, 14 Jul 2017 21:30:12 -0400
- Subject: Re: grp/grp_merge.c alignment fix
- Authentication-results: sourceware.org; auth=none
- References: <xnvamuvg7y.fsf@greed.delorie.com>
On 07/14/2017 05:52 PM, DJ Delorie wrote:
>
> Updated patch with the boolean coercion removed.
OK with ChangeLog tweak.
> [BZ #21654]
> * grp/grp_merge.c (__copy_grp): Make sure pointers-to-not-char
> are properly aligned.
Suggest:
* grp/grp_merge.c (__copy_grp): Align char** to minimum pointer
alignment not char alignment.
Should say in first person what we are doing and succintly.
> (__merge_grp): Likewise.
>
> diff --git a/grp/grp-merge.c b/grp/grp-merge.c
> index 77c494d..6590e5d 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];
>
--
Cheers,
Carlos.