Files
bitcoin/src
fanquake 6a11d9e330 Merge #18433: serialization: prevent int overflow for big Coin::nHeight
e980214bc4 serialization: prevent int overflow for big Coin::nHeight (pierrenn)

Pull request description:

  This is an attempt to fix fuzzer issues 1,2,8 reported by practicalswift here : https://github.com/bitcoin/bitcoin/issues/18046

  The fuzzer harness doesn't prevent deserialization of unrealistic high values for `Coin::nHeight`.  In the [provided examples](https://github.com/bitcoin/bitcoin/issues/18046), we have :
  - `blockundo_deserialize` : the varint `0x8DD88DD700` is deserialized as `3944983552` in `Coin::nHeight` (`TxInOutFormatter::Unser`)
  - `coins_deserialize` : the varint `0x8DD5D5EC40` is deserialized as `3939874496` similarly
  - `txundo_deserialize`: the varint `0x8DCD828F01` is deserialized as `3921725441` in `Coin::nHeight` (`Coin::Unserialize`)

  Since `Coin::nHeight` is 31 bit long, multiplying a large value by 2 triggers the fuzzer.

  AFAIK those values are unrealistic (~70k years for the smallest..). I've looked a bit a reducing the range of values the fuzzer can deserialize, but this seems to be too much code change for not much.

  Hence this PR chooses to static cast `nHeight` when re-serializing; it seems to be the less intrusive/safest way to prevent the fuzzer output.

  Another more "upstream" approach would be to limit `Coin::nHeight` values to something more realistic, e.g. `0xFFFFFFF` (~5k years) :

  de3a30bab2/src/undo.h (L39) and de3a30bab2/src/coins.h (L71)

  Thanks !

  NB: i was also not sure about the component/area to prefix the PR/commit with.. ?

ACKs for top commit:
  practicalswift:
    ACK e980214bc4 -- patch looks correct
  promag:
    ACK e980214bc4.
  sipa:
    utACK e980214bc4
  MarcoFalke:
    re-ACK e980214bc4 🎑
  ryanofsky:
    Code review ACK e980214bc4. Just removed ternary ? 1 : 0 and replaced / 2 with >> 1 since last review

Tree-SHA512: 905fc9e5e52a6857abee4a1c863751767835965804bb8c39474f27a120f65399ff4ba7a49ef1da0ba565379f8c12095bd384b6c492cf06776f01b2db68d522b8
2020-03-30 22:16:12 +08:00
..
2020-03-18 10:34:53 -07:00
2020-02-09 07:44:29 -08:00
2020-03-27 10:14:08 -04:00
2020-02-10 12:00:10 -08:00
2020-02-10 12:00:10 -08:00
2020-01-31 12:36:13 +00:00
2020-01-31 12:36:13 +00:00
2019-12-23 06:12:10 +07:00
2020-01-16 18:25:11 -08:00
2020-02-28 14:56:49 -08:00
2020-03-27 08:59:06 -04:00
2020-03-15 22:43:39 +00:00
2020-02-10 12:00:10 -08:00