Skip to content

Commit

Permalink
Initial fix for #3434: Add ENSURE_BAG helper which ensures memory is
Browse files Browse the repository at this point in the history
really committed by the OS for a new bag.

Call ENSURE_BAG on new bags created in integer.c if they might be
passed as an argument to a GMP function.
  • Loading branch information
embray committed May 2, 2019
1 parent 1213dab commit 3b0f375
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/gasman.h
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,18 @@ EXPORT_INLINE UInt ResizeWordSizedBag(Bag bag, UInt size)
}


#if defined(SYS_IS_CYGWIN32) && defined(SYS_IS_64_BIT)
EXPORT_INLINE void ENSURE_BAG(Bag bag)
{
memset(PTR_BAG(bag), 0, SIZE_BAG(bag));
}
#else
EXPORT_INLINE void ENSURE_BAG(Bag bag)
{
}
#endif


/****************************************************************************
**
*F CollectBags(<size>,<full>) . . . . . . . . . . . . . . collect dead bags
Expand Down
9 changes: 9 additions & 0 deletions src/integer.c
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ static void NEW_FAKEMPZ( fake_mpz_t fake, UInt size )
}
else {
fake->obj = NewBag( T_INTPOS, size * sizeof(mp_limb_t) );
ENSURE_BAG(fake->obj);
}
}

Expand Down Expand Up @@ -1789,9 +1790,11 @@ Obj ModInt(Obj opL, Obj opR)
}

mod = NewBag( TNUM_OBJ(opL), (SIZE_INT(opL)+1)*sizeof(mp_limb_t) );
ENSURE_BAG(mod);

quo = NewBag( T_INTPOS,
(SIZE_INT(opL)-SIZE_INT(opR)+1)*sizeof(mp_limb_t) );
ENSURE_BAG(quo);

/* and let gmp do the work */
mpn_tdiv_qr( (mp_ptr)ADDR_INT(quo), (mp_ptr)ADDR_INT(mod), 0,
Expand Down Expand Up @@ -1888,6 +1891,8 @@ Obj QuoInt(Obj opL, Obj opR)
quo = NewBag( T_INTPOS, SIZE_OBJ(opL) );
else
quo = NewBag( T_INTNEG, SIZE_OBJ(opL) );

ENSURE_BAG(quo);

if ( k < 0 ) k = -k;

Expand All @@ -1906,6 +1911,7 @@ Obj QuoInt(Obj opL, Obj opR)

/* create a new bag for the remainder */
rem = NewBag( TNUM_OBJ(opL), (SIZE_INT(opL)+1)*sizeof(mp_limb_t) );
ENSURE_BAG(rem);

/* allocate a bag for the quotient */
if ( TNUM_OBJ(opL) == TNUM_OBJ(opR) )
Expand All @@ -1914,6 +1920,7 @@ Obj QuoInt(Obj opL, Obj opR)
else
quo = NewBag( T_INTNEG,
(SIZE_INT(opL)-SIZE_INT(opR)+1)*sizeof(mp_limb_t) );
ENSURE_BAG(quo);

mpn_tdiv_qr( (mp_ptr)ADDR_INT(quo), (mp_ptr)ADDR_INT(rem), 0,
(mp_srcptr)CONST_ADDR_INT(opL), SIZE_INT(opL),
Expand Down Expand Up @@ -2035,9 +2042,11 @@ Obj RemInt(Obj opL, Obj opR)
return opL;

rem = NewBag( TNUM_OBJ(opL), (SIZE_INT(opL)+1)*sizeof(mp_limb_t) );
ENSURE_BAG(rem);

quo = NewBag( T_INTPOS,
(SIZE_INT(opL)-SIZE_INT(opR)+1)*sizeof(mp_limb_t) );
ENSURE_BAG(quo);

/* and let gmp do the work */
mpn_tdiv_qr( (mp_ptr)ADDR_INT(quo), (mp_ptr)ADDR_INT(rem), 0,
Expand Down

0 comments on commit 3b0f375

Please sign in to comment.