From 49476d06993fd9df7d1e7ebe94ca508226ffa1f5 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 28 Apr 2016 06:58:53 -0700 Subject: Fix broken bignum to int_ptr_t conversion. This one affects all platforms. The extra sign check and negation cancels out the one done in mp_get_uintptr, causing a positive value for a negative input value. * mpi/mpi.c (mp_get_intptr): Just coerce the uint_ptr_t result to int_ptr_t. That has the right semantics under that the bits are preserved (under two's complement, in every compiler I've ever used). The unsigned value from mp_get_uintptr already looks like the image of a two's complement value. --- mpi/mpi.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'mpi/mpi.c') diff --git a/mpi/mpi.c b/mpi/mpi.c index 96dc71d4..42a267b5 100644 --- a/mpi/mpi.c +++ b/mpi/mpi.c @@ -606,10 +606,9 @@ mp_err mp_get_uintptr(mp_int *mp, uint_ptr_t *z) mp_err mp_get_intptr(mp_int *mp, int_ptr_t *z) { uint_ptr_t tmp = 0; - int_ptr_t out; mp_get_uintptr(mp, &tmp); - out = tmp; - *z = (SIGN(mp) == MP_NEG) ? -out : out; + /* Reliance on bitwise unsigned to two's complement conversion */ + *z = (int_ptr_t) tmp; return MP_OKAY; } -- cgit v1.2.3