lkml.org 
[lkml]   [2016]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/8] lib/mpi: mpi_write_sgl(): fix skipping of leading zero limbs
    Date
    Currently, if the number of leading zeros is greater than fits into a
    complete limb, mpi_write_sgl() skips them by iterating over them limb-wise.

    However, it fails to adjust its internal leading zeros tracking variable,
    lzeros, accordingly: it does a

    p -= sizeof(alimb);
    continue;

    which should really have been a

    lzeros -= sizeof(alimb);
    continue;

    Since lzeros never decreases if its initial value >= sizeof(alimb), nothing
    gets copied by mpi_write_sgl() in that case.

    Instead of skipping the high order zero limbs within the loop as shown
    above, fix the issue by adjusting the copying loop's bounds.

    Fixes: 2d4d1eea540b ("lib/mpi: Add mpi sgl helpers")
    Signed-off-by: Nicolai Stange <nicstange@gmail.com>
    ---
    lib/mpi/mpicoder.c | 21 +++++++++------------
    1 file changed, 9 insertions(+), 12 deletions(-)

    diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c
    index eb15e7d..6bb52be 100644
    --- a/lib/mpi/mpicoder.c
    +++ b/lib/mpi/mpicoder.c
    @@ -380,7 +380,9 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes,
    buf_len = sgl->length;
    p2 = sg_virt(sgl);

    - for (i = a->nlimbs - 1; i >= 0; i--) {
    + for (i = a->nlimbs - 1 - lzeros / BYTES_PER_MPI_LIMB,
    + lzeros %= BYTES_PER_MPI_LIMB;
    + i >= 0; i--) {
    alimb = a->d[i];
    p = (u8 *)&alimb2;
    #if BYTES_PER_MPI_LIMB == 4
    @@ -401,17 +403,12 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes,
    #error please implement for this limb size.
    #endif
    if (lzeros > 0) {
    - if (lzeros >= sizeof(alimb)) {
    - p -= sizeof(alimb);
    - continue;
    - } else {
    - mpi_limb_t *limb1 = (void *)p - sizeof(alimb);
    - mpi_limb_t *limb2 = (void *)p - sizeof(alimb)
    - + lzeros;
    - *limb1 = *limb2;
    - p -= lzeros;
    - y = lzeros;
    - }
    + mpi_limb_t *limb1 = (void *)p - sizeof(alimb);
    + mpi_limb_t *limb2 = (void *)p - sizeof(alimb)
    + + lzeros;
    + *limb1 = *limb2;
    + p -= lzeros;
    + y = lzeros;
    lzeros -= sizeof(alimb);
    }

    --
    2.7.2
    \
     
     \ /
      Last update: 2016-03-17 19:41    [W:4.120 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site