From 4f29a7323a664994f633a7bcd5a1afc2914156fa Mon Sep 17 00:00:00 2001 From: mdw Date: Sat, 19 Oct 2002 18:55:08 +0000 Subject: [PATCH] Fix overflows in shift primitives. --- mpx.c | 23 +++++++++++++++++------ tests/mp | 5 ++++- tests/mpx | 6 +++++- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/mpx.c b/mpx.c index b88bd49..d7ea70a 100644 --- a/mpx.c +++ b/mpx.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: mpx.c,v 1.13 2002/10/19 17:56:50 mdw Exp $ + * $Id: mpx.c,v 1.14 2002/10/19 18:55:08 mdw Exp $ * * Low-level multiprecision arithmetic * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: mpx.c,v $ + * Revision 1.14 2002/10/19 18:55:08 mdw + * Fix overflows in shift primitives. + * * Revision 1.13 2002/10/19 17:56:50 mdw * Fix bit operations. Test them (a bit) better. * @@ -470,8 +473,12 @@ void mpx_lsl(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, size_t n) /* --- Handle a shift by a multiple of the word size --- */ if (nb == 0) { - MPX_COPY(dv + nw, dvl, av, avl); - memset(dv, 0, MPWS(nw)); + if (nw >= dvl - dv) + MPX_ZERO(dv, dvl); + else { + MPX_COPY(dv + nw, dvl, av, avl); + memset(dv, 0, MPWS(nw)); + } } /* --- And finally the difficult case --- * @@ -562,8 +569,12 @@ void mpx_lsr(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, size_t n) /* --- Handle a shift by a multiple of the word size --- */ - if (nb == 0) - MPX_COPY(dv, dvl, av + nw, avl); + if (nb == 0) { + if (nw >= avl - av) + MPX_ZERO(dv, dvl); + else + MPX_COPY(dv, dvl, av + nw, avl); + } /* --- And finally the difficult case --- */ @@ -572,7 +583,7 @@ void mpx_lsr(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, size_t n) size_t nr = MPW_BITS - nb; av += nw; - w = *av++; + w = av < avl ? *av++ : 0; while (av < avl) { mpw t; if (dv >= dvl) diff --git a/tests/mp b/tests/mp index c451acb..98399a2 100644 --- a/tests/mp +++ b/tests/mp @@ -1,6 +1,6 @@ # Test vectors for MP functions # -# $Id: mp,v 1.13 2002/10/19 17:56:50 mdw Exp $ +# $Id: mp,v 1.14 2002/10/19 18:55:08 mdw Exp $ add { 5 4 9; 5 -4 1; -5 4 -1; -5 -4 -9; @@ -34,6 +34,9 @@ lsr2c { -1 5 -1; 1 5 0; -6 2 -2; + 7 2 1; + -7 2 -2; + -7 -2 0; } setbit { diff --git a/tests/mpx b/tests/mpx index e8aabac..1603838 100644 --- a/tests/mpx +++ b/tests/mpx @@ -1,6 +1,6 @@ # Test vectors for low-level MP functions # -# $Id: mpx,v 1.8 2002/10/06 22:52:50 mdw Exp $ +# $Id: mpx,v 1.9 2002/10/19 18:55:08 mdw Exp $ # --- Load-store tests --- # @@ -50,6 +50,8 @@ lsl { 01 2 04; 01 4 10; + 7 -1 0; + # --- Copy shifts --- 01 0 01; @@ -133,6 +135,8 @@ lsr { 04 2 01; 10 4 01; + 7 -1 0; + 7 32 0; # --- Copy shifts --- -- 2.11.0