From nobody Mon Feb 9 07:28:25 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1564072663; cv=none; d=zoho.com; s=zohoarc; b=TLZKTvhMEebZaShrWWxUruyuhSVYRf7HR3Neke3sTF6vgHtWzDu/tgB6cE5xi826dY4pmzSLaOUu4/dZL9HBX6lBmgH5xvmyZNmIoBVKdy73mmxdHitvWngVd46C9RuAbE4tc02epAhLIdUrSYLsDj+vbZcRZ2pZ9InlUdrmHkU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1564072663; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=yM6cVpuxn4Ke92kaJ4AKkVK8RWiK/GxhKcUyMJM8z1M=; b=JzUj4h4UWbdF5jdpVNcVOXAKOi/nXp1c+YxCWDuvq/rq90if1AicAWmFVMOhFE+mOXkvqUYwMoTzTVECLR6Lc2y5lFI8O1Xt/XQr25BI9EKtClq45u1LFmJ2/fOSdJjF/TKJkXohJlDgDegmlz2Mml3YfRUnoL9vio/J3YMnr6c= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1564072663555123.32869791388998; Thu, 25 Jul 2019 09:37:43 -0700 (PDT) Received: from localhost ([::1]:33918 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hqgkP-0005nU-VY for importer@patchew.org; Thu, 25 Jul 2019 12:37:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48366) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hqgk0-0004bY-H9 for qemu-devel@nongnu.org; Thu, 25 Jul 2019 12:37:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hqgjz-0007EZ-CJ for qemu-devel@nongnu.org; Thu, 25 Jul 2019 12:37:16 -0400 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]:55848) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hqgjz-0007DE-68 for qemu-devel@nongnu.org; Thu, 25 Jul 2019 12:37:15 -0400 Received: by mail-wm1-x341.google.com with SMTP id a15so45582588wmj.5 for ; Thu, 25 Jul 2019 09:37:15 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c7sm44125140wro.70.2019.07.25.09.37.12 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 25 Jul 2019 09:37:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yM6cVpuxn4Ke92kaJ4AKkVK8RWiK/GxhKcUyMJM8z1M=; b=DjFVat4FH98pFLbbLk+slSWzmsHNOwovfvZGBlQivOkRG7faTKI4L17ghY1gr0OT8e dEyxzQp+sEZb3zmxy7p4NEuXHEF7dcSOCLREPlVQlAj4jq2CTp1s8Z7uawZ5Y70Ri3Pt FAJhHPaygvT7rEL4jNOQhJOjPqvDTSIo30Le3qdEd+D1Vkona5/NouCdJx7jMD4A/l9F iVLcDOn56kRqGdAVpTDhCTP7hQBJgih1aaeC011DEupvIoEerSecl/hO2aNq2+/HFQFP FDbau2qt4aMqfbZl/VGXpo/Zfh+LzDy01qmuQ7L+Bo8wrBo+rgFpZ7IWU8Kuz02NG5CZ W4Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yM6cVpuxn4Ke92kaJ4AKkVK8RWiK/GxhKcUyMJM8z1M=; b=F3PUCcFM2EDAF1DzV+SpxO5J1c/9vVuTeqOWWvA1CIJiUPspjSyrIJ7MZWUobffbzA 9QhaOfZwqf3+mbzE/WHSpwULg7LdvJsQduVryuH8nN6c3sTFKdDKhKCfk9miKmMyvVnz CXyZeHh7G10KULCZH+0ZcBQtECuvMLOpEsh/LUk+6tuTcq2GGuv3/KBtpGruSjijvxaw 2vSmczx6lLsGmLjgwccs82fneKWoUA0ppjZKwFCQJUJb3RI20vu99fosNImtE59/r9Gm 3jjWLGKJ4nHxdDa5uD89LcJsUye8QDXFwdVMgWv0nujDzlIrHZSm35g9A0Hag42GhovB zxBw== X-Gm-Message-State: APjAAAUrpVpee70+0Yv08a30J2PfiTAFTwPjGk+XYTELA2NpB0Xz2Mjv znDZXosFX1VTemQUi0Ovsxs9ZRwROtD1NQ== X-Google-Smtp-Source: APXvYqzjRObidkUUfzdjentlnvHNZgkWCtmlb67xi5wGU1sjg4idDDa2EPCiD3rTMRScFiWPS8NO5w== X-Received: by 2002:a1c:7e85:: with SMTP id z127mr82974403wmc.95.1564072634239; Thu, 25 Jul 2019 09:37:14 -0700 (PDT) From: Peter Maydell To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Date: Thu, 25 Jul 2019 17:37:09 +0100 Message-Id: <20190725163710.11703-2-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190725163710.11703-1-peter.maydell@linaro.org> References: <20190725163710.11703-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::341 Subject: [Qemu-devel] [PATCH for-4.1? 1/2] stellaris_input: Fix vmstate description of buttons field X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Damien Hedde , "Dr. David Alan Gilbert" , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" gamepad_state::buttons is a pointer to an array of structs, not an array of structs, so should be declared in the vmstate with VMSTATE_STRUCT_VARRAY_POINTER_INT32; otherwise we corrupt memory on incoming migration. We bump the vmstate version field as the easiest way to deal with the migration break, since migration wouldn't have worked reliably before anyway. Signed-off-by: Peter Maydell Reviewed-by: Damien Hedde Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/input/stellaris_input.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/hw/input/stellaris_input.c b/hw/input/stellaris_input.c index 20c87d86f40..3a666d61d47 100644 --- a/hw/input/stellaris_input.c +++ b/hw/input/stellaris_input.c @@ -60,12 +60,14 @@ static const VMStateDescription vmstate_stellaris_butto= n =3D { =20 static const VMStateDescription vmstate_stellaris_gamepad =3D { .name =3D "stellaris_gamepad", - .version_id =3D 1, - .minimum_version_id =3D 1, + .version_id =3D 2, + .minimum_version_id =3D 2, .fields =3D (VMStateField[]) { VMSTATE_INT32(extension, gamepad_state), - VMSTATE_STRUCT_VARRAY_INT32(buttons, gamepad_state, num_buttons, 0, - vmstate_stellaris_button, gamepad_button), + VMSTATE_STRUCT_VARRAY_POINTER_INT32(buttons, gamepad_state, + num_buttons, + vmstate_stellaris_button, + gamepad_button), VMSTATE_END_OF_LIST() } }; --=20 2.20.1 From nobody Mon Feb 9 07:28:25 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1564072666; cv=none; d=zoho.com; s=zohoarc; b=hnpMqy67P7VYkJxU9dOTTze189pNwk4aEHkO66NyoQ/b6+4RABU6hTBnMTjatuHN/Z689eQEHoo3hZAfnIGUYM0/v12OfCPf1tAw6SL0fkWweI793cScWBnA6lcsgMQk80rQ8fZRO9Eg1Xe8sYqqNlOQIEH8Vn5znG/h+xG04w8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1564072666; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=vYIyeQ8tMXnaOwO0DQZAfFrr4L+yvHcwOrLW+5bk0zY=; b=WXHFhlSnvbYBQBwDE+Tv7fgJry6SFMh3p32wDSNpkKGUwfUp0pOvThwphbB7YF80Co4OgsJEjyWa4gJeKbYXHmsxZ0YCh1Ms2OhO0fTKJZ+s4bD8cgomN1ElI1AtRDDsw/fQUkxyAFIO6U5qL++nOSSyq3qb6M3R9Dy8PMxGtH4= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1564072666113463.6287569163803; Thu, 25 Jul 2019 09:37:46 -0700 (PDT) Received: from localhost ([::1]:33922 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hqgkS-000618-Mj for importer@patchew.org; Thu, 25 Jul 2019 12:37:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48407) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hqgk1-0004bv-S7 for qemu-devel@nongnu.org; Thu, 25 Jul 2019 12:37:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hqgk0-0007GX-Jm for qemu-devel@nongnu.org; Thu, 25 Jul 2019 12:37:17 -0400 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]:38907) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hqgk0-0007FA-Af for qemu-devel@nongnu.org; Thu, 25 Jul 2019 12:37:16 -0400 Received: by mail-wm1-x341.google.com with SMTP id s15so23961600wmj.3 for ; Thu, 25 Jul 2019 09:37:16 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c7sm44125140wro.70.2019.07.25.09.37.14 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 25 Jul 2019 09:37:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vYIyeQ8tMXnaOwO0DQZAfFrr4L+yvHcwOrLW+5bk0zY=; b=BIIE0CQgSuzQhD5JHhS+DUvDX58ZBtNd/3IMydrGj9GMl5erOtSqeUQiDgup9G7f7H jZPsrsDgzOQsBRMSk0u64vW8VoEfiw44RoMj2h9u/sx1SPMTd9VRCoSvbHopi2OSyCOS 8ob7cBKA8ZlJe++dzY9xH8y3lMi8IY+74u2NAfrQWPiSiX6ewS3XzE8TW3uT9Xm5l8Ta e2oea7RgQHsYdJWuTDCCJJd6fHhlMWuHTtq8QOxk/0q+sIaSBBPenVsAVj/tk0aTdenj KixokBmtWXSFayPuuXM6cQfMlkHOjz0UgPvEq2zoVJtA6eNIPtFunUIoPTJioiZGb9mI wDcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vYIyeQ8tMXnaOwO0DQZAfFrr4L+yvHcwOrLW+5bk0zY=; b=LejxTIXt0M2+u+GMd5TNZ8F7KLEZP4I5LS7x032E+LH0w42k9hRqZ3Nq0EMYL/8y0K 64bhbkiWCtWOg2ffeg3jo6g+/53v65xrxv2hI3g7eEqY4bgSLMXWTf+lA0bqA8R+E+4x Jdztm26LOeMpxJC7AxWaWTGS07mcaaubaboG6u4wEkAXWWbeKMmidEOQOUX5qjC5LmNU mJepdkflXd2Tm2WQEvn0m9NxSYnto1aA1CmnPXYsYzu6799d2pV1jhBC9GsDFe4wtsy6 FcZE7jlbyZP+gRvGTd/Wzr0279UFuggT/6MfBicMd4D6BWhu8/KB6UuBNixalV8bBAOv wd9Q== X-Gm-Message-State: APjAAAX8JSEPP+pANMa1g4L9PDiV4MPi0sTbpB9rVRakgspAkXuLwl3Q loC1wvwjjwi8TXb0kd4650eHdQ== X-Google-Smtp-Source: APXvYqzl/s5DNtM4udnBAIIshRg4xUpgXXVcC5QkqsUdPjJyVN7fJkdQr6bM0BPzooQoccCCx9nDfQ== X-Received: by 2002:a1c:35c2:: with SMTP id c185mr79395234wma.58.1564072635360; Thu, 25 Jul 2019 09:37:15 -0700 (PDT) From: Peter Maydell To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Date: Thu, 25 Jul 2019 17:37:10 +0100 Message-Id: <20190725163710.11703-3-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190725163710.11703-1-peter.maydell@linaro.org> References: <20190725163710.11703-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::341 Subject: [Qemu-devel] [PATCH for-4.1? 2/2] vmstate.h: Type check VMSTATE_STRUCT_VARRAY macros X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Damien Hedde , "Dr. David Alan Gilbert" , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" The VMSTATE_STRUCT_VARRAY_UINT32 macro is intended to handle migrating a field which is an array of structs, but where instead of migrating the entire array we only migrate a variable number of elements of it. The VMSTATE_STRUCT_VARRAY_POINTER_UINT32 macro is intended to handle migrating a field which is of pointer type, and points to a dynamically allocated array of structs of variable size. We weren't actually checking that the field passed to VMSTATE_STRUCT_VARRAY_UINT32 really is an array, with the result that accidentally using it where the _POINTER_ macro was intended would compile but silently corrupt memory on migration. Add type-checking that enforces that the field passed in is really of the right array type. This applies to all the VMSTATE macros which use flags including VMS_VARRAY_* but not VMS_POINTER. Signed-off-by: Peter Maydell Reviewed-by: Damien Hedde Reviewed-by: Dr. David Alan Gilbert Tested-by: Damien Hedde --- include/migration/vmstate.h | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index ca68584eba4..2df333c3612 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -227,8 +227,19 @@ extern const VMStateInfo vmstate_info_bitmap; extern const VMStateInfo vmstate_info_qtailq; =20 #define type_check_2darray(t1,t2,n,m) ((t1(*)[n][m])0 - (t2*)0) +/* Check that t2 is an array of t1 of size n */ #define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0) #define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0) +/* + * type of element 0 of the specified (array) field of the type. + * Note that if the field is a pointer then this will return the + * pointed-to type rather than complaining. + */ +#define typeof_elt_of_field(type, field) typeof(((type *)0)->field[0]) +/* Check that field f in struct type t2 is an array of t1, of any size */ +#define type_check_varray(t1, t2, f) \ + (type_check(t1, typeof_elt_of_field(t2, f)) \ + + QEMU_BUILD_BUG_ON_ZERO(!QEMU_IS_ARRAY(((t2 *)0)->f))) =20 #define vmstate_offset_value(_state, _field, _type) \ (offsetof(_state, _field) + \ @@ -253,6 +264,10 @@ extern const VMStateInfo vmstate_info_qtailq; vmstate_offset_array(_state, _field, uint8_t, \ sizeof(typeof_field(_state, _field))) =20 +#define vmstate_offset_varray(_state, _field, _type) \ + (offsetof(_state, _field) + \ + type_check_varray(_type, _state, _field)) + /* In the macros below, if there is a _version, that means the macro's * field will be processed only if the version being received is >=3D * the _version specified. In general, if you add a new field, you @@ -347,7 +362,7 @@ extern const VMStateInfo vmstate_info_qtailq; .info =3D &(_info), \ .size =3D sizeof(_type), \ .flags =3D VMS_VARRAY_UINT32|VMS_MULTIPLY_ELEMENTS, \ - .offset =3D offsetof(_state, _field), \ + .offset =3D vmstate_offset_varray(_state, _field, _type), \ } =20 #define VMSTATE_ARRAY_TEST(_field, _state, _num, _test, _info, _type) {\ @@ -376,7 +391,7 @@ extern const VMStateInfo vmstate_info_qtailq; .info =3D &(_info), \ .size =3D sizeof(_type), \ .flags =3D VMS_VARRAY_INT32, \ - .offset =3D offsetof(_state, _field), \ + .offset =3D vmstate_offset_varray(_state, _field, _type), \ } =20 #define VMSTATE_VARRAY_INT32(_field, _state, _field_num, _version, _info, = _type) {\ @@ -416,7 +431,7 @@ extern const VMStateInfo vmstate_info_qtailq; .info =3D &(_info), \ .size =3D sizeof(_type), \ .flags =3D VMS_VARRAY_UINT16, \ - .offset =3D offsetof(_state, _field), \ + .offset =3D vmstate_offset_varray(_state, _field, _type), \ } =20 #define VMSTATE_VSTRUCT_TEST(_field, _state, _test, _version, _vmsd, _type= , _struct_version) { \ @@ -520,7 +535,7 @@ extern const VMStateInfo vmstate_info_qtailq; .vmsd =3D &(_vmsd), \ .size =3D sizeof(_type), \ .flags =3D VMS_STRUCT|VMS_VARRAY_UINT8, \ - .offset =3D offsetof(_state, _field), \ + .offset =3D vmstate_offset_varray(_state, _field, _type), \ } =20 /* a variable length array (i.e. _type *_field) but we know the @@ -573,7 +588,7 @@ extern const VMStateInfo vmstate_info_qtailq; .vmsd =3D &(_vmsd), \ .size =3D sizeof(_type), \ .flags =3D VMS_STRUCT|VMS_VARRAY_INT32, \ - .offset =3D offsetof(_state, _field), \ + .offset =3D vmstate_offset_varray(_state, _field, _type), \ } =20 #define VMSTATE_STRUCT_VARRAY_UINT32(_field, _state, _field_num, _version,= _vmsd, _type) { \ @@ -583,7 +598,7 @@ extern const VMStateInfo vmstate_info_qtailq; .vmsd =3D &(_vmsd), \ .size =3D sizeof(_type), \ .flags =3D VMS_STRUCT|VMS_VARRAY_UINT32, \ - .offset =3D offsetof(_state, _field), \ + .offset =3D vmstate_offset_varray(_state, _field, _type), \ } =20 #define VMSTATE_STRUCT_VARRAY_ALLOC(_field, _state, _field_num, _version, = _vmsd, _type) {\ --=20 2.20.1