hw/s390/ccw.c: Don't take address of packed members
Taking the address of a field in a packed struct is a bad idea, because it might not be actually aligned enough for that pointer type (and thus cause a crash on dereference on some host architectures). Newer versions of clang warn about this. Avoid the problem by using local copies of the PMCW and SCSW struct fields in copy_schib_from_guest() and copy_schib_to_guest(). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Message-Id: <20181213120252.21697-1-peter.maydell@linaro.org> Reviewed-by: Farhan Ali <alifm@linux.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
b72566a4ff
commit
55281a2c53
|
@ -1290,9 +1290,19 @@ void copy_scsw_to_guest(SCSW *dest, const SCSW *src)
|
|||
static void copy_schib_to_guest(SCHIB *dest, const SCHIB *src)
|
||||
{
|
||||
int i;
|
||||
/*
|
||||
* We copy the PMCW and SCSW in and out of local variables to
|
||||
* avoid taking the address of members of a packed struct.
|
||||
*/
|
||||
PMCW src_pmcw, dest_pmcw;
|
||||
SCSW src_scsw, dest_scsw;
|
||||
|
||||
copy_pmcw_to_guest(&dest->pmcw, &src->pmcw);
|
||||
copy_scsw_to_guest(&dest->scsw, &src->scsw);
|
||||
src_pmcw = src->pmcw;
|
||||
copy_pmcw_to_guest(&dest_pmcw, &src_pmcw);
|
||||
dest->pmcw = dest_pmcw;
|
||||
src_scsw = src->scsw;
|
||||
copy_scsw_to_guest(&dest_scsw, &src_scsw);
|
||||
dest->scsw = dest_scsw;
|
||||
dest->mba = cpu_to_be64(src->mba);
|
||||
for (i = 0; i < ARRAY_SIZE(dest->mda); i++) {
|
||||
dest->mda[i] = src->mda[i];
|
||||
|
@ -1339,9 +1349,19 @@ static void copy_scsw_from_guest(SCSW *dest, const SCSW *src)
|
|||
static void copy_schib_from_guest(SCHIB *dest, const SCHIB *src)
|
||||
{
|
||||
int i;
|
||||
/*
|
||||
* We copy the PMCW and SCSW in and out of local variables to
|
||||
* avoid taking the address of members of a packed struct.
|
||||
*/
|
||||
PMCW src_pmcw, dest_pmcw;
|
||||
SCSW src_scsw, dest_scsw;
|
||||
|
||||
copy_pmcw_from_guest(&dest->pmcw, &src->pmcw);
|
||||
copy_scsw_from_guest(&dest->scsw, &src->scsw);
|
||||
src_pmcw = src->pmcw;
|
||||
copy_pmcw_from_guest(&dest_pmcw, &src_pmcw);
|
||||
dest->pmcw = dest_pmcw;
|
||||
src_scsw = src->scsw;
|
||||
copy_scsw_from_guest(&dest_scsw, &src_scsw);
|
||||
dest->scsw = dest_scsw;
|
||||
dest->mba = be64_to_cpu(src->mba);
|
||||
for (i = 0; i < ARRAY_SIZE(dest->mda); i++) {
|
||||
dest->mda[i] = src->mda[i];
|
||||
|
|
Loading…
Reference in a new issue