Skip to content

Commit

Permalink
fix(math): defend NewIntFromBigInt argument mutation (#17352)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexanderbez authored Aug 10, 2023
1 parent c3c82e2 commit 658a88a
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
1 change: 1 addition & 0 deletions math/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ Ref: https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.j

### Bug Fixes

* [#17352](https://github.com/cosmos/cosmos-sdk/pull/17352) Ensure that modifying the argument to `NewIntFromBigInt` doesn't mutate the returned value.
* [#16266](https://github.com/cosmos/cosmos-sdk/pull/16266) fix: legacy dec power mut zero exponent precision.

## [math/v1.0.1](https://github.com/cosmos/cosmos-sdk/releases/tag/math/v1.0.1) - 2023-05-15
Expand Down
4 changes: 3 additions & 1 deletion math/int.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ func NewIntFromUint64(n uint64) Int {

// NewIntFromBigInt constructs Int from big.Int. If the provided big.Int is nil,
// it returns an empty instance. This function panics if the bit length is > 256.
// Note, the caller can safely mutate the argument after this function returns.
func NewIntFromBigInt(i *big.Int) Int {
if i == nil {
return Int{}
Expand All @@ -114,7 +115,8 @@ func NewIntFromBigInt(i *big.Int) Int {
if i.BitLen() > MaxBitLen {
panic("NewIntFromBigInt() out of bound")
}
return Int{i}

return Int{new(big.Int).Set(i)}
}

// NewIntFromString constructs Int from string
Expand Down
13 changes: 13 additions & 0 deletions math/int_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,19 @@ func (s *intTestSuite) TestFromUint64() {
}
}

func (s *intTestSuite) TestNewIntFromBigInt() {
i := math.NewIntFromBigInt(nil)
s.Require().True(i.IsNil())

r := big.NewInt(42)
i = math.NewIntFromBigInt(r)
s.Require().Equal(r, i.BigInt())

// modify r and ensure i doesn't change
r = r.SetInt64(100)
s.Require().NotEqual(r, i.BigInt())
}

func (s *intTestSuite) TestIntPanic() {
// Max Int = 2^256-1 = 1.1579209e+77
// Min Int = -(2^256-1) = -1.1579209e+77
Expand Down

0 comments on commit 658a88a

Please sign in to comment.