Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752217AbcDUR2q (ORCPT ); Thu, 21 Apr 2016 13:28:46 -0400 Received: from mga14.intel.com ([192.55.52.115]:36775 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751340AbcDUR2p (ORCPT ); Thu, 21 Apr 2016 13:28:45 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,513,1455004800"; d="scan'208";a="963682695" Subject: Re: [PATCH] lib/mpi: Fix kernel unaligned acces in mpi_write_to_sgl To: Sowmini Varadhan , linux-kernel@vger.kernel.org References: <20160421110736.GL22060@oracle.com> Cc: herbert@gondor.apana.org.au, smueller@chronox.de, mmarek@suse.com, arnd@arndb.de, andrew.zaborowski@intel.com From: Tadeusz Struk Message-ID: <57190C88.8000608@intel.com> Date: Thu, 21 Apr 2016 10:23:20 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <20160421110736.GL22060@oracle.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1440 Lines: 48 On 04/21/2016 04:07 AM, Sowmini Varadhan wrote: > > Commit 2d4d1eea540b ("lib/mpi: Add mpi sgl helpers") added > mpi_write_to_sgl() which generates traps due to unaligned > access on some platforms like sparc. Fix this by using > the get_unaligned* and put_unaligned* functions. > > Fixes: 2d4d1eea540b ("lib/mpi: Add mpi sgl helpers") > Signed-off-by: Sowmini Varadhan > --- > lib/mpi/mpicoder.c | 12 ++++++++---- > 1 files changed, 8 insertions(+), 4 deletions(-) > > diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c > index eb15e7d..6771378 100644 > --- a/lib/mpi/mpicoder.c > +++ b/lib/mpi/mpicoder.c > @@ -21,6 +21,7 @@ > #include > #include > #include "mpi-internal.h" > +#include > > #define MAX_EXTERN_MPI_BITS 16384 > > @@ -405,10 +406,13 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes, > p -= sizeof(alimb); > continue; > } else { > - mpi_limb_t *limb1 = (void *)p - sizeof(alimb); > - mpi_limb_t *limb2 = (void *)p - sizeof(alimb) > - + lzeros; > - *limb1 = *limb2; > + mpi_limb_t tmp; > + > + tmp = get_unaligned_be32((void *)p - > + sizeof(alimb) + > + lzeros); > + put_unaligned_be32(tmp, > + (void *)p - sizeof(alimb)); > p -= lzeros; > y = lzeros; > } What if the mpi_limb_t will happen to be 64 bit? Thanks, -- TS