From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id A7C0B387056D for ; Wed, 14 Dec 2022 23:43:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A7C0B387056D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 2BEMwaZf009159 for ; Wed, 14 Dec 2022 23:43:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : content-transfer-encoding : content-type : mime-version; s=corp-2022-7-12; bh=hT4t5D8CpCiXTdAZFrbYLAqD9UHh1fFCb0/IzBDGzMo=; b=JpwA+isS6H0/oU4Iz9klaPZNXtYz0xwS8xEjffHuOJ8vzUVaUc0WI4C9js2dSa/UvlWl /x+Nh1y98WHMaH+aW2CtJLsTw3uYq16OhTNdPwqDVmT3AUbdg3wFSPTYDY5OHotC54Ti PUwMIy7wgbVVDmWgpC/C59NJ0gcLu1ICFDPx2kmq47t1wI8+15iUtjhmgQyRRW29ddqC mFgM8p/5+2YjHCFu2Hh9v+3HqkWzq2uSkjaFwhvqKfeaL95SQP6zRsEPUJ0J2emCrx6q SkAd9eSUV5vxoA0U7VsYVjNbKcU0HhGwvh3rqCimcxZnHnWIB9eGl6078LW0ksSmw0zt nA== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3meyeubnxn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 14 Dec 2022 23:43:23 +0000 Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 2BENCfxx003951 for ; Wed, 14 Dec 2022 23:43:22 GMT Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10lp2100.outbound.protection.outlook.com [104.47.55.100]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3meyewuffj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 14 Dec 2022 23:43:22 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=P10yetImenYZhtyma+zewn8hwXpvJlzrm997HtO7eDS8tkMuaguI/jA/BGS+Qkzdh2mXFgm/AYFJ2jeSAIGx7LFOtDn9tlNpXU3QeNJGf5rQWt5u3RSAlIbrzocYcsg9kghJzCkrOIZ3zOiXhvxYHhDajf4jfGPiZOUhekhwjMJt/FgbivRwtO3PSYJcFTx8uPEIQth43UFoik2nmYn2kdzwoB2EMXyflaJJiLgvh52+hbp0rSqkoZDO4DS9NRIe1ffOu9T3tN6OK4eqI/KOhdPjcdC6kxPIwsKQpMPs7FrI+3yBIdmx0Wn1JCxpYcQk/YJCtHDo1MgbgJL7xxlmjw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hT4t5D8CpCiXTdAZFrbYLAqD9UHh1fFCb0/IzBDGzMo=; b=bKrf0TjJFzH2HrBWBcwJHV/1gIeft6olMqipXjDhJoFgjfw61nd68pUE3iphLzT6QIz+vHCVVzuiodmDsHsuFQt4abC/a29TG6AhdE1D75dLKLe3FsLhxgSnWIlT8odaLmeMIp/SLx1pLWw38n0aQKb1oKF4esIa1foe6NaKYlwzkQJNrC/qEiuWeVnG5e62bJ6k1hTu6dejXfRuRVKh5XmrT/e1pEKxYDWJrHH6krIE89Yft5zVt0ow5Wtw3MZMr5SWkhd0C+M5NiBsWuI3tboIaqKTQptVVnF7Putz5jMTcM3a+dzB+8KhidF2+Uz65YVymwFXQIXKt96nVBouNQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hT4t5D8CpCiXTdAZFrbYLAqD9UHh1fFCb0/IzBDGzMo=; b=Cazq5Rsj3BPnlOhnQ/dnb0sq0F2Qer0m4qo3ZnB6+dAgD0XgDR7KB3048AJ6spmaSefLzhiCjjYAJNRJpSYc90adVtmoLEa12Vas6qF26K3hr7KnJxLlOhZcIeZ8f12oqfgCgl9ahgoUCkepxQ33p3eh9q+/4IAvN8+3z/xUjvw= Received: from MWHPR1001MB2158.namprd10.prod.outlook.com (2603:10b6:301:2d::17) by CH0PR10MB5162.namprd10.prod.outlook.com (2603:10b6:610:de::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5924.11; Wed, 14 Dec 2022 23:43:20 +0000 Received: from MWHPR1001MB2158.namprd10.prod.outlook.com ([fe80::ee70:1952:4416:1bdc]) by MWHPR1001MB2158.namprd10.prod.outlook.com ([fe80::ee70:1952:4416:1bdc%5]) with mapi id 15.20.5880.019; Wed, 14 Dec 2022 23:43:20 +0000 From: Indu Bhagat To: binutils@sourceware.org Cc: Indu Bhagat Subject: [PATCH, PR 29856] libsframe: avoid generating misaligned loads Date: Wed, 14 Dec 2022 15:43:10 -0800 Message-Id: <20221214234310.1247719-1-indu.bhagat@oracle.com> X-Mailer: git-send-email 2.37.2 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: MW4PR02CA0006.namprd02.prod.outlook.com (2603:10b6:303:16d::12) To MWHPR1001MB2158.namprd10.prod.outlook.com (2603:10b6:301:2d::17) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR1001MB2158:EE_|CH0PR10MB5162:EE_ X-MS-Office365-Filtering-Correlation-Id: ec58a583-5ad9-47f2-4394-08dade2cfb0a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: igHjqK9J7kLCBwtx6CFvIKzc08CMZMbXkU/oPo8YvR7En8Ws8dOJYwAcw4vgsd5UeSiMKYmeYaZf6YIA3sPWMA/AEytyEusgxvBxKINax2O+OaLNHwjATfFqlSVBBMpxYDKAkFct5OtiapIAdkHPeYBM7ri80oTIqxwsr3ksQSZqG++YWvtLtzqe94Mc4uCfZaAnAVd7CfmdZtvJS+ghN3Nan2CM7ZKuptphu5a4uq6I4ISA9Zg6vRiLV055DJQm7Euodld4HvzLJotcpKkkNXvlZUU/e9PlcHMvziCJFqdN2JtL/0lzNYVZ0JaypMJcyMZvbF97WvBhgbGIk13SnpdAeOFV5KJKBbb7FNN0WmhHS3+nJypkfhrNt82q4Jk+odL5MdvRFpW9sto9fiUFOWGdZl1D7KUq0YEuBkFlvreBWQdTJgV2nFLYe+0AZXEYb+5nqtrlN/sQkiZi5U4BOUbtrSEUs5MbuchiZVmrEvcIW0HKAjrXImV4r4s1gigTFM+l2lkVhtCBRvw8vBnpailsZr0NcoMm4+JGZf+xysO+nbMCUL2Kiaa0iSLbS6/u4E8DlxTQf9HFvfwkCQY2//8b8C9EQAfQ+basWNRhkm742VCXtmOCNwFIVpYz+mrBwBvbZ0EjnDLwxVqo71Z5sg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR1001MB2158.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(39860400002)(376002)(396003)(366004)(136003)(346002)(451199015)(36756003)(107886003)(478600001)(1076003)(6486002)(6666004)(6506007)(2616005)(44832011)(86362001)(2906002)(6916009)(316002)(41300700001)(186003)(8676002)(83380400001)(66476007)(66556008)(66946007)(6512007)(4326008)(38100700002)(5660300002)(8936002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?AxePHtw3vsP5K9llZ/V9/cGe7xYOJBmSwyAXInrIJp6bo6onoFumHMuPrwLZ?= =?us-ascii?Q?oJX19t2nWA03vMma91iI9GF4mGt1cR3QFPy2UJfsoxB3jgZRn/LAJ/FRLj2C?= =?us-ascii?Q?3CsQkrEFlfK0WWJKX5svd0nVcGf2zEHAqERfX6eIgFZNSRuPjj6f/60CQZyW?= =?us-ascii?Q?4Z+Zgl4dimiatF9xms4Em+bbk3O1pLcxA0D59E1l5ySvY/KHormXbALBzLSo?= =?us-ascii?Q?SH1wP6n/CHREgvmmZaqKgAND/AZ4rbMfHU/mWp2un0CYEDa4NhwMDhtYYF68?= =?us-ascii?Q?zfVJjzYlFxYrIqmUH5veb9UwWRivakmKtSibrp8nCuHCn5dsj3eReAAErlpb?= =?us-ascii?Q?29ZKteWbKjqpCGAJaKruuqLCumxmmB/nt+RzS2dpg78MgquyX5sPuu3L9urs?= =?us-ascii?Q?YhLc3q3EnHcXzoNoAxzKiRMRfLTeegU6ztcFLPlogUo3ktOCYvXqHXGeF4nn?= =?us-ascii?Q?vaZNW5MGB89l+W/7+9LGe2O2MOD7ZmUu3G8zXJqODeEgirHCQZmHROvDQZmC?= =?us-ascii?Q?U1f/ozx9FAMxEh8mPrUl1Tu5McDmxwm0k5zCPEwgLqk/yMUrmSmARpg9r9W0?= =?us-ascii?Q?n9DCpMRomUX+g8y5zRS3G4MZX1EZnXNoJHKKBO3fIS+1I1dRWR6Zw807d3dU?= =?us-ascii?Q?VPjImnCwHdX0oVUfa2mO1TrwFrRev10gflDuXoRzQd4N6DTU9XTZGgFRBvvH?= =?us-ascii?Q?LYqFX8L3UZqmTkcUImpI2Og3BF/x8DFfER9n9T6J2tozLbeqBL4ocqnaLTWl?= =?us-ascii?Q?afsD34zPF4ryHotXKro/8ucxRr1R/lqlCNMCi0dr3im3+iQ9im+BtXtnnJxH?= =?us-ascii?Q?7T8kQ3aoCXpdioQeIAovCmv7Pp3j4HuziDLRR8oApq2DBIikIJoNRWWwx2Ha?= =?us-ascii?Q?cXqPJsQgWvSrsBy00sHQiH52C7R5Cw0GeyBaT38rN+KPt6aUdHuJfXnYPAEl?= =?us-ascii?Q?khwsP3qQvx2i0ys+sT3GqnkJh3alZJAnvXauRm/IRmYe+WX2wE7AKT43xV2R?= =?us-ascii?Q?U//6ui7fFoewz93ceZJJHGKY3Fbib1LeiS2vAe4TFW565zqSwm/wPNQ3q1hV?= =?us-ascii?Q?NenrZlBp1jN4MSKa87khYqEPgJozSTKYearnsfs6c+b6+z8sBkZr7fjgeR/4?= =?us-ascii?Q?SsRX8ST60dd1ECmXJNsq0Jc+Lm5GY7Via5rc737phwHIbHnNic/X162M+mvd?= =?us-ascii?Q?CBK+5dBq2PkHCo7I+67jC2hHG3EcfkIomeV5zqR+8TpoBm+IzoUWTcAWfw0c?= =?us-ascii?Q?/erxSQ01jbYherLjtbiv5YAcECgimLRec47K5HiKpNFLd1dEuofc4tvhS00B?= =?us-ascii?Q?8rBUVzYoxLvAVpV3OhEh2xN9IoStscMaVaGaiba5gEwu/O0dcJVeLz7zvtVA?= =?us-ascii?Q?a8pEBLthbtaWWjtZHJ2arXEnB6WCT2+W8zsqv1gthO9npw1aiHOsZM5FNUgp?= =?us-ascii?Q?MBgQZ1hcx0MSYdnNJSl0O+n/dhSD5h+khI5HWumTUhItWT1qXjbCRHT9rXhp?= =?us-ascii?Q?TooDmZgrj9H37vfyckxh0oDACq7lbUY5TRGgPY86KgnwRqmAfrr/s6YqTA7a?= =?us-ascii?Q?Iquur9mr13qE2HPZ3l+bxRB371gqdOJ+QyZMqyZyjpsBAtsMlepOjcXBUHFi?= =?us-ascii?Q?S9nMvdoi9bhuNHZXO9CJUJY=3D?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: ec58a583-5ad9-47f2-4394-08dade2cfb0a X-MS-Exchange-CrossTenant-AuthSource: MWHPR1001MB2158.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Dec 2022 23:43:19.9902 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: c/LNklvyyOOOwB2FG+YVTLF+DkCqKP0GBvCyXHPVswFA4hXSd7UMaZsRQM7T27LrRG4ZfRZzl313eSGaBvP1Ew== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR10MB5162 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.923,Hydra:6.0.545,FMLib:17.11.122.1 definitions=2022-12-14_11,2022-12-14_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 suspectscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2212070000 definitions=main-2212140195 X-Proofpoint-ORIG-GUID: FdBnfxwq2-gYUwdCHipPdKamCYaNxlqb X-Proofpoint-GUID: FdBnfxwq2-gYUwdCHipPdKamCYaNxlqb X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SCC_10_SHORT_WORD_LINES,SCC_5_SHORT_WORD_LINES,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hello, This patch fixes the PR 29856 "libsframe asan: load misaligned at sframe.c:516". More details below in the commit log. Testing Notes: - Regression tested gas testsuite with -fsanitize=alignment for --target=aarch64-elf showed the issues fixed and no new regressions. - binutils try bit showed no new regressions - various native and cross builds (on host aarch64-linux and host x86_64-linux) showed no new regressions. Thanks ------------------------ There are two places where unaligned loads were seen on aarch64: - #1. access to the SFrame FRE stack offsets in the in-memory representation/abstraction provided by libsframe. - #2. access to the SFrame FRE start address in the on-disk representation of the frame row entry. For #1, we can fix this by reordering the struct members of sframe_frame_row_entry in libsframe/sframe-api.h. For #2, we need to default to using memcpy instead, and copy out the bytes to a location for output. SFrame format is an unaligned on-disk format. As such, there are other blobs of memory in the on-disk SFrame FRE that are on not on their natural boundaries. But that does not pose further problems yet, because the users are provided access to the on-disk SFrame FRE data via libsframe's sframe_frame_row_entry, the latter has its' struct members aligned on their respective natural boundaries (and initialized using memcpy). PR 29856 libsframe asan: load misaligned at sframe.c:516 ChangeLog: PR libsframe/29856 * bfd/elf64-x86-64.c: Adjust as the struct members have been reordered. * libsframe/sframe.c (sframe_decode_fre_start_address): Use memcpy to perform 16-bit/32-bit reads. * libsframe/testsuite/libsframe.encode/encode-1.c: Adjust as the struct members have been reordered. include/ChangeLog: PR libsframe/29856 * sframe-api.h: Reorder fre_offsets for natural alignment. --- bfd/elf64-x86-64.c | 24 +++++++++---------- include/sframe-api.h | 8 +++++-- libsframe/sframe.c | 18 ++++++++++++-- .../testsuite/libsframe.encode/encode-1.c | 16 ++++++------- 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index afc8c76c52b..8cf733d89e0 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -822,48 +822,48 @@ static const bfd_byte elf_x86_64_eh_frame_non_lazy_plt[] = static const sframe_frame_row_entry elf_x86_64_sframe_null_fre = { 0, - SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B), /* FRE info. */ - {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* 12 bytes. */ + {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */ + SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */ }; /* .sframe FRE covering the .plt section entry. */ static const sframe_frame_row_entry elf_x86_64_sframe_plt0_fre1 = { 0, /* SFrame FRE start address. */ - SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B), /* FRE info. */ - {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* 12 bytes. */ + {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */ + SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */ }; /* .sframe FRE covering the .plt section entry. */ static const sframe_frame_row_entry elf_x86_64_sframe_plt0_fre2 = { 6, /* SFrame FRE start address. */ - SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B), /* FRE info. */ - {24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* 12 bytes. */ + {24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */ + SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */ }; /* .sframe FRE covering the .plt section entry. */ static const sframe_frame_row_entry elf_x86_64_sframe_pltn_fre1 = { 0, /* SFrame FRE start address. */ - SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B), /* FRE info. */ - {8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* 12 bytes. */ + {8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */ + SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */ }; /* .sframe FRE covering the .plt section entry. */ static const sframe_frame_row_entry elf_x86_64_sframe_pltn_fre2 = { 11, /* SFrame FRE start address. */ - SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B), /* FRE info. */ - {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* 12 bytes. */ + {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */ + SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */ }; /* .sframe FRE covering the second .plt section entry. */ static const sframe_frame_row_entry elf_x86_64_sframe_sec_pltn_fre1 = { 0, /* SFrame FRE start address. */ - SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B), /* FRE info. */ - {8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* 12 bytes. */ + {8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */ + SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */ }; /* SFrame helper object for non-lazy PLT. Also used for IBT enabled PLT. */ diff --git a/include/sframe-api.h b/include/sframe-api.h index 3338a2ebd5c..bd1833558a4 100644 --- a/include/sframe-api.h +++ b/include/sframe-api.h @@ -35,13 +35,17 @@ typedef struct sframe_encoder_ctx sframe_encoder_ctx; /* User interfacing SFrame Row Entry. An abstraction provided by libsframe so the consumer is decoupled from - the binary format representation of the same. */ + the binary format representation of the same. + + The members are best ordered such that they are aligned at their natural + boundaries. This helps avoid usage of undesirable misaligned memory + accesses. See PR libsframe/29856. */ typedef struct sframe_frame_row_entry { uint32_t fre_start_addr; - unsigned char fre_info; unsigned char fre_offsets[MAX_OFFSET_BYTES]; + unsigned char fre_info; } sframe_frame_row_entry; #define SFRAME_ERR ((int) -1) diff --git a/libsframe/sframe.c b/libsframe/sframe.c index ef821da3901..b8fde2f04f8 100644 --- a/libsframe/sframe.c +++ b/libsframe/sframe.c @@ -670,6 +670,11 @@ sframe_frame_row_entry_copy (sframe_frame_row_entry *dst, sframe_frame_row_entry return 0; } +/* Decode the SFrame FRE start address offset value from FRE_BUF in on-disk + binary format, given the FRE_TYPE. Updates the FRE_START_ADDR. + + Returns 0 on success, SFRAME_ERR otherwise. */ + static int sframe_decode_fre_start_address (const char *fre_buf, uint32_t *fre_start_addr, @@ -677,6 +682,9 @@ sframe_decode_fre_start_address (const char *fre_buf, { uint32_t saddr = 0; int err = 0; + size_t addr_size = 0; + + addr_size = sframe_fre_start_addr_size (fre_type); if (fre_type == SFRAME_FRE_TYPE_ADDR1) { @@ -686,12 +694,18 @@ sframe_decode_fre_start_address (const char *fre_buf, else if (fre_type == SFRAME_FRE_TYPE_ADDR2) { uint16_t *ust = (uint16_t *)fre_buf; - saddr = (uint32_t)*ust; + /* SFrame is an unaligned on-disk format. Using memcpy helps avoid the + use of undesirable unaligned loads. See PR libsframe/29856. */ + uint16_t tmp = 0; + memcpy (&tmp, ust, addr_size); + saddr = (uint32_t)tmp; } else if (fre_type == SFRAME_FRE_TYPE_ADDR4) { uint32_t *uit = (uint32_t *)fre_buf; - saddr = (uint32_t)*uit; + int32_t tmp = 0; + memcpy (&tmp, uit, addr_size); + saddr = (uint32_t)tmp; } else return sframe_set_errno (&err, SFRAME_ERR_INVAL); diff --git a/libsframe/testsuite/libsframe.encode/encode-1.c b/libsframe/testsuite/libsframe.encode/encode-1.c index 01481106a62..0f5225ff9ec 100644 --- a/libsframe/testsuite/libsframe.encode/encode-1.c +++ b/libsframe/testsuite/libsframe.encode/encode-1.c @@ -33,10 +33,10 @@ add_fde1 (sframe_encoder_ctx *encode, int idx) int i, err; /* A contiguous block containing 4 FREs. */ sframe_frame_row_entry fres[] - = { {0x0, 0x3, {0x8, 0, 0}}, - {0x1, 0x5, {0x10, 0xf0, 0}}, - {0x4, 0x4, {0x10, 0xf0, 0}}, - {0x1a, 0x5, {0x8, 0xf0, 0}} + = { {0x0, {0x8, 0, 0}, 0x3}, + {0x1, {0x10, 0xf0, 0}, 0x5}, + {0x4, {0x10, 0xf0, 0}, 0x4}, + {0x1a, {0x8, 0xf0, 0}, 0x5} }; unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1, @@ -58,10 +58,10 @@ add_fde2 (sframe_encoder_ctx *encode, int idx) int i, err; /* A contiguous block containing 4 FREs. */ sframe_frame_row_entry fres[] - = { {0x0, 0x3, {0x8, 0, 0}}, - {0x1, 0x5, {0x10, 0xf0, 0}}, - {0x4, 0x4, {0x10, 0xf0, 0}}, - {0xf, 0x5, {0x8, 0xf0, 0}} + = { {0x0, {0x8, 0, 0}, 0x3}, + {0x1, {0x10, 0xf0, 0}, 0x5}, + {0x4, {0x10, 0xf0, 0}, 0x4}, + {0xf, {0x8, 0xf0, 0}, 0x5} }; unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1, -- 2.37.2