On Thu, Aug 31, 2017 at 05:57:11PM +0400, Stanislav Kinsburskiy wrote:
> The structure autofs_v5_packet (except name) is not aligned by 8 bytes, which
> lead to different sizes in 32 and 64-bit architectures.
> Let's form 32-bit compatible packet when daemon has 32-bit addressation.
> 
> Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>
> ---
>  fs/autofs4/waitq.c |   11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c
> index 309ca6b..484cf2e 100644
> --- a/fs/autofs4/waitq.c
> +++ b/fs/autofs4/waitq.c
> @@ -153,12 +153,19 @@ static void autofs4_notify_daemon(struct autofs_sb_info 
> *sbi,
>       {
>               struct autofs_v5_packet *packet = &pkt.v5_pkt.v5_packet;
>               struct user_namespace *user_ns = sbi->pipe->f_cred->user_ns;
> +             size_t name_offset;
>  
> -             pktsz = sizeof(*packet);
> +             if (sbi->is32bit)
> +                     name_offset = offsetof(struct autofs_v5_packet, len) +
> +                                   sizeof(packet->len);
> +             else
> +                     name_offset = offsetof(struct autofs_v5_packet, name);

This doesn't help at all because the offset of struct autofs_v5_packet.name
does not change.

> +             pktsz = name_offset + sizeof(packet->name);

What changes is pktsz: it's either sizeof(struct autofs_v5_packet)
or 4 bytes less, depending on the architecture.  For example,

#ifdef CONFIG_COMPAT
        if (__alignof__(compat_u64) < __alignof__(u64) && sbi->is32bit)
                pktsz = offsetofend(struct autofs_v5_packet, name);
        else
#endif
        pktsz = sizeof(*packet);


-- 
ldv

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to