Patch "lib/mpi: Endianness fix" has been added to the 4.4-stable tree
This is a note to let you know that I've just added the patch titled
lib/mpi: Endianness fix
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
lib-mpi-endianness-fix.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
3ee0cb5fb5eea2110db1b5cb7f67029b7be8a376Mon Sep 17 00:00:00 2001
From: Michal Marek <[email protected]>
Date: Wed, 17 Feb 2016 14:46:59 +0100
Subject: lib/mpi: Endianness fix
From: Michal Marek <[email protected]>
commit 3ee0cb5fb5eea2110db1b5cb7f67029b7be8a376 upstream.
The limbs are integers in the host endianness, so we can't simply iterate over the individual bytes. The current code happens to work on little-endian, because the order of the limbs in the MPI array is the same as the order of the bytes in each limb, but it breaks on big-endian.
--- lib/mpi/mpicoder.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-)
lib/mpi/mpicoder.c +21 -18
@@ -128,6 +128,23 @@ leave: }EXPORT_SYMBOL_GPL (mpi_read_from_buffer); +static int count_lzeros (MPI a) +{ +mpi_limb_t alimb; +int i, lzeros =0 ; + +for (i = a->nlimbs -1 ; i >=0 ; i--) { + alimb = a->d[i]; +if (alimb ==0 ) { + lzeros +=sizeof (mpi_limb_t); + }else { + lzeros +=count_leading_zeros (alimb) /8 ; +break ; + } + } +return lzeros; +} +/** * mpi_read_buffer() - read MPI to a bufer provided by user (msb first) *
@@ -146,7 +163,7 @@ int mpi_read_buffer(MPI a, uint8_t *buf,uint8_t *p;mpi_limb_t alimb;unsigned int n =mpi_get_size (a); -int i, lzeros =0 ; +int i, lzeros;if (buf_len < n || !buf || !nbytes)return -EINVAL ;
@@ -154,14 +171,7 @@ int mpi_read_buffer(MPI a, uint8_t *buf,if (sign) *sign = a->sign; - p = (void *)&a->d[a->nlimbs] -1 ; - -for (i = a->nlimbs *sizeof (alimb) -1 ; i >=0 ; i--, p--) { -if (!*p) - lzeros++; -else -break ; - } + lzeros =count_lzeros (a); p = buf; *nbytes = n - lzeros;
@@ -343,7 +353,7 @@ int mpi_write_to_sgl(MPI a, struct scattu8 *p, *p2;mpi_limb_t alimb, alimb2;unsigned int n =mpi_get_size (a); -int i, x, y =0 , lzeros =0 , buf_len; +int i, x, y =0 , lzeros, buf_len;if (!nbytes || *nbytes < n)return -EINVAL ;
@@ -351,14 +361,7 @@ int mpi_write_to_sgl(MPI a, struct scattif (sign) *sign = a->sign; - p = (void *)&a->d[a->nlimbs] -1 ; - -for (i = a->nlimbs *sizeof (alimb) -1 ; i >=0 ; i--, p--) { -if (!*p) - lzeros++; -else -break ; - } + lzeros =count_lzeros (a); *nbytes = n - lzeros; buf_len = sgl->length;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/lib-mpi-endianness-fix.patch