Message ID | 20230307154256.101528-2-Mathis.Marion@silabs.com |
---|---|
State | New |
Headers | show |
Series | Missing endianness conversions in user mode | expand |
Le 07/03/2023 à 16:42, Mathis Marion a écrit : > From: Mathis Marion <mathis.marion@silabs.com> > > The sin6_scope_id field uses the host byte order, so there is a > conversion to be made when host and target endianness differ. > > Signed-off-by: Mathis Marion <mathis.marion@silabs.com> > --- > linux-user/syscall.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 247e20572d..bafa77d353 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -1713,6 +1713,11 @@ static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr, > lladdr = (struct target_sockaddr_ll *)addr; > lladdr->sll_ifindex = tswap32(lladdr->sll_ifindex); > lladdr->sll_hatype = tswap16(lladdr->sll_hatype); > + } else if (sa_family == AF_INET6) { > + struct sockaddr_in6 *in6addr; > + > + in6addr = (struct sockaddr_in6 *)addr; > + in6addr->sin6_scope_id = tswap32(in6addr->sin6_scope_id); > } > unlock_user(target_saddr, target_addr, 0); > Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Le 07/03/2023 à 16:42, Mathis Marion a écrit : > From: Mathis Marion <mathis.marion@silabs.com> > > The sin6_scope_id field uses the host byte order, so there is a > conversion to be made when host and target endianness differ. > > Signed-off-by: Mathis Marion <mathis.marion@silabs.com> > --- > linux-user/syscall.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 247e20572d..bafa77d353 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -1713,6 +1713,11 @@ static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr, > lladdr = (struct target_sockaddr_ll *)addr; > lladdr->sll_ifindex = tswap32(lladdr->sll_ifindex); > lladdr->sll_hatype = tswap16(lladdr->sll_hatype); > + } else if (sa_family == AF_INET6) { > + struct sockaddr_in6 *in6addr; > + > + in6addr = (struct sockaddr_in6 *)addr; > + in6addr->sin6_scope_id = tswap32(in6addr->sin6_scope_id); > } > unlock_user(target_saddr, target_addr, 0); > Applied to my linux-user-for-8.0 branch. Thanks, Laurent
On 7/3/23 16:42, Mathis Marion wrote: > From: Mathis Marion <mathis.marion@silabs.com> > > The sin6_scope_id field uses the host byte order, so there is a > conversion to be made when host and target endianness differ. > > Signed-off-by: Mathis Marion <mathis.marion@silabs.com> > --- > linux-user/syscall.c | 5 +++++ > 1 file changed, 5 insertions(+) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 247e20572d..bafa77d353 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1713,6 +1713,11 @@ static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr, lladdr = (struct target_sockaddr_ll *)addr; lladdr->sll_ifindex = tswap32(lladdr->sll_ifindex); lladdr->sll_hatype = tswap16(lladdr->sll_hatype); + } else if (sa_family == AF_INET6) { + struct sockaddr_in6 *in6addr; + + in6addr = (struct sockaddr_in6 *)addr; + in6addr->sin6_scope_id = tswap32(in6addr->sin6_scope_id); } unlock_user(target_saddr, target_addr, 0);