Skip to content

Commit

Permalink
Fixed GH-17398: bcmul memory leak (#17615)
Browse files Browse the repository at this point in the history
Changed BCG memory allocation to be forcibly released in
PHP_GSHUTDOWN_FUNCTION regardless of refcount.

Fixes #17398
Closes #17615
  • Loading branch information
SakiTakamachi committed Jan 29, 2025
1 parent ed1d51f commit 5a4832f
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 3 deletions.
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? ????, PHP 8.3.18

- BCMath:
. Fixed bug GH-17398 (bcmul memory leak). (SakiTakamachi)

13 Feb 2025, PHP 8.3.17

Expand Down
6 changes: 3 additions & 3 deletions ext/bcmath/bcmath.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,9 @@ static PHP_GINIT_FUNCTION(bcmath)
/* {{{ PHP_GSHUTDOWN_FUNCTION */
static PHP_GSHUTDOWN_FUNCTION(bcmath)
{
_bc_free_num_ex(&bcmath_globals->_zero_, 1);
_bc_free_num_ex(&bcmath_globals->_one_, 1);
_bc_free_num_ex(&bcmath_globals->_two_, 1);
bc_force_free_number(&bcmath_globals->_zero_);
bc_force_free_number(&bcmath_globals->_one_);
bc_force_free_number(&bcmath_globals->_two_);
}
/* }}} */

Expand Down
2 changes: 2 additions & 0 deletions ext/bcmath/libbcmath/src/bcmath.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ typedef struct bc_struct {

void bc_init_numbers(void);

void bc_force_free_number(bc_num *num);

bc_num _bc_new_num_ex(size_t length, size_t scale, bool persistent);

void _bc_free_num_ex(bc_num *num, bool persistent);
Expand Down
7 changes: 7 additions & 0 deletions ext/bcmath/libbcmath/src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,13 @@ void bc_init_numbers(void)
BCG(_two_)->n_value[0] = 2;
}

void bc_force_free_number(bc_num *num)
{
pefree((*num)->n_ptr, 1);
pefree(*num, 1);
*num = NULL;
}


/* Make a copy of a number! Just increments the reference count! */
bc_num bc_copy_num(bc_num num)
Expand Down
10 changes: 10 additions & 0 deletions ext/bcmath/tests/gh17398.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--TEST--
GH-17398 (bcmul memory leak)
--EXTENSIONS--
bcmath
--FILE--
<?php
bcmul('0', '0', 2147483647);
?>
--EXPECTF--
Fatal error: Allowed memory size of %d bytes exhausted%s(tried to allocate %d bytes) in %s on line %d

0 comments on commit 5a4832f

Please sign in to comment.