bitcoin/src
Wladimir J. van der Laan 9641366950
Merge #17293: Add assertion to randrange that input is not 0
a35b6824f3 Add assertion to randrange that input is not 0 (Jeremy Rubin)

Pull request description:

  From the comment in randrange, their is an implicit argument that randrange cannot accept an argument of 0. If the argument is 0, then we have to return {}, which is not possible in a uint64_t.

  The current code takes a very interesting approach, which is to return [0..std::numeric_limits<uint64_t>]. This can cause all sorts of fun problems, like allocating a lot of memory, accessing random memory (maybe with your private keys), and crashing the computer entirely.

  This gives us three choices of how to make it "safe":

  1) return Optional<uint64_t>
  2) Change the return type to [0..range]
  3) Return 0 if 0
  4) Assert(range)

  So which solution is best?

  1) seems a bit overkill, as it makes any code using randrange worse.
  2) Changing the return type as in 2 could be acceptable, but it imposes the potential overflow checking on the caller (which is what we want).
  3) An interesting option -- effective makes the return type in {0} U [0..range]. But this is a bad choice, because it leads to code like `vec[randrange(vec.size())]`, which is incorrect for an empty vector. Null set should mean null set.
  4) Assert(range) stands out as the best mitigation for now, with perhaps a future change to solution 2. It prevents the error from propagating at the earliest possible time, so the program crashes cleanly rather than by freezing the computer or accessing random memory.

ACKs for top commit:
  instagibbs:
    Seems reasonable for now, ACK a35b6824f3
  laanwj:
    ACK a35b6824f3
  promag:
    ACK a35b6824f3.

Tree-SHA512: 8fc626cde4b04b918100cb7af28753f25ec697bd077ce0e0c640be0357626322aeea233e3c8fd964ba1564b0fda830b7f5188310ebbb119c113513a4b89952dc
2019-11-02 11:40:56 +01:00
..
bench Merge #17292: Add new mempool benchmarks for a complex pool 2019-11-01 18:08:41 -04:00
compat compat: remove bswap_* check on macOS 2019-10-24 16:01:44 -04:00
config
consensus [validation] Remove fMissingInputs from AcceptToMemoryPool() 2019-10-29 15:46:45 -04:00
crypto Fix occurences of c_str() used with size() to data() 2019-10-28 13:41:45 +01:00
index Remove unused includes 2019-10-15 22:56:43 +00:00
interfaces Merge #15921: validation: Tidy up ValidationState interface 2019-10-30 15:37:34 +01:00
leveldb Pull leveldb subtree 2019-01-26 12:45:48 -05:00
node Merge #15921: validation: Tidy up ValidationState interface 2019-10-30 15:37:34 +01:00
policy refactor: Remove redundant c_str() calls in formatting 2019-10-28 13:31:33 +01:00
primitives Remove unused includes 2019-10-15 22:56:43 +00:00
qt Merge #16839: Replace Connman and BanMan globals with NodeContext local 2019-10-30 12:35:41 +01:00
rpc Merge #15921: validation: Tidy up ValidationState interface 2019-10-30 15:37:34 +01:00
script Merge #17260: Split some CWallet functions into new LegacyScriptPubKeyMan 2019-10-29 08:19:23 -04:00
secp256k1 Update the secp256k1 subtree to the latest upstream version 2019-03-31 11:41:05 -07:00
support Improve documentation of memory_cleanse() 2019-07-01 12:59:44 +02:00
test Merge #17254: test: fix script_p2sh_tests OP_PUSHBACK2/4 missing 2019-11-01 17:57:31 -04:00
univalue Update univalue subtree 2019-10-30 16:24:02 -04:00
util Merge #15921: validation: Tidy up ValidationState interface 2019-10-30 15:37:34 +01:00
wallet Merge #17300: LegacyScriptPubKeyMan code cleanups 2019-10-31 14:40:39 -04:00
zmq Remove unused includes 2019-10-15 22:56:43 +00:00
.clang-format util: Add AllowShortCaseLabelsOnASingleLine option 2019-10-14 13:24:54 +03:00
addrdb.cpp addrdb: Remove temporary files created in SerializeFileDB. Fixes non-determinism in unit tests. 2019-06-14 08:30:43 +02:00
addrdb.h banman: Add, use CBanEntry ctor that takes ban reason 2019-01-16 13:54:18 -05:00
addrman.cpp Make reasoning about dependencies easier by not including unused dependencies 2019-06-02 17:15:23 +02:00
addrman.h [addrman] Ensure collisions eventually get resolved 2019-02-27 16:53:44 -05:00
amount.h Update copyright headers to 2018 2018-12-29 10:15:01 +01:00
arith_uint256.cpp Remove unused includes 2019-10-15 22:56:43 +00:00
arith_uint256.h Remove unused includes 2019-10-15 22:56:43 +00:00
attributes.h Add NODISCARD to all {Decode,Parse}[...](...) functions returning bool. Sort includes. 2018-11-05 17:03:11 +01:00
banman.cpp scripted-diff: Make translation bilingual 2019-07-24 16:33:20 +03:00
banman.h scripted-diff: Remove g_connman, g_banman globals 2019-10-28 10:30:51 -04:00
base58.cpp scripted-diff: Move util files to separate directory. 2018-11-04 22:46:07 -08:00
base58.h Add NODISCARD to all {Decode,Parse}[...](...) functions returning bool. Sort includes. 2018-11-05 17:03:11 +01:00
bech32.cpp Add some general std::vector utility functions 2019-10-16 08:56:57 -07:00
bech32.h Assert that the HRP is lowercase in Bech32::Encode 2019-09-05 13:25:11 +12:00
bitcoin-cli-res.rc
bitcoin-cli.cpp Merge #17302: cli: Add "headers" and "verificationprogress" to -getinfo 2019-10-30 12:38:31 +01:00
bitcoin-tx-res.rc
bitcoin-tx.cpp refactor: Remove redundant c_str() calls in formatting 2019-10-28 13:31:33 +01:00
bitcoin-wallet-res.rc [tools] Add wallet inspection and modification tool 2019-01-30 16:26:52 -05:00
bitcoin-wallet.cpp refactor: Remove redundant c_str() calls in formatting 2019-10-28 13:31:33 +01:00
bitcoind-res.rc
bitcoind.cpp Merge #16839: Replace Connman and BanMan globals with NodeContext local 2019-10-30 12:35:41 +01:00
blockencodings.cpp [validation] Add CValidationState subclasses 2019-10-29 15:46:45 -04:00
blockencodings.h Remove unused includes 2019-10-15 22:56:43 +00:00
blockfilter.cpp init: Add CLI option to enable block filter index. 2019-04-06 12:10:55 -07:00
blockfilter.h init: Add CLI option to enable block filter index. 2019-04-06 12:10:55 -07:00
bloom.cpp refactor: Improve CRollingBloomFilter::reset by using std::fill 2019-05-22 15:55:50 +01:00
bloom.h Removes unsed CBloomFilter constructor. 2018-08-13 01:24:55 +02:00
chain.cpp refactor: combine Chain::findFirstBlockWithTime/findFirstBlockWithTimeAndHeight 2019-03-27 18:29:48 -04:00
chain.h chain: Set all CBlockIndex members to null, remove SetNull helper 2019-10-16 13:06:50 -04:00
chainparams.cpp Chainparams: Use name constants in chainparams initialization 2019-10-29 20:27:30 +01:00
chainparams.h Remove wallet settings from chainparams 2019-07-16 16:22:14 -04:00
chainparamsbase.cpp Testchains: Generic selection with -chain=<str> in addition of -testnet and -regtest 2019-09-06 22:05:33 +02:00
chainparamsbase.h Remove wallet settings from chainparams 2019-07-16 16:22:14 -04:00
chainparamsseeds.h contrib: Remove invalid nodes from seeds list 2019-10-02 08:51:12 +02:00
checkqueue.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
clientversion.cpp Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
clientversion.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
coins.cpp move-onlyish: move CCoinsViewErrorCatcher out of init.cpp 2019-07-21 21:00:31 -04:00
coins.h make SaltedOutpointHasher noexcept 2019-09-25 20:56:38 +02:00
compat.h windows: Set _WIN32_WINNT to 0x0601 (Windows 7) 2019-01-23 16:28:27 +08:00
compressor.cpp Remove unused includes 2019-10-15 22:56:43 +00:00
compressor.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
core_io.h Move PSBT decoding functions from core_io to psbt.cpp 2019-03-26 17:38:00 -07:00
core_memusage.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
core_read.cpp Include core_io.h from core_read.cpp 2019-06-06 08:00:33 +02:00
core_write.cpp Don't show addresses or P2PK in decoderawtransaction 2019-08-30 11:29:21 +09:00
cuckoocache.h doc: Doxygen-friendly CuckooCache comments 2019-10-10 15:47:39 -04:00
dbwrapper.cpp Replace deprecated Boost Filesystem function 2019-04-30 10:05:54 +03:00
dbwrapper.h Remove unused includes 2019-10-15 22:56:43 +00:00
dummywallet.cpp scripted-diff: Rename InitInterfaces to NodeContext 2019-10-28 10:30:51 -04:00
flatfile.cpp Style cleanup. 2019-02-22 17:38:45 -08:00
flatfile.h Style cleanup. 2019-02-22 17:38:45 -08:00
fs.cpp Fix occurences of c_str() used with size() to data() 2019-10-28 13:41:45 +01:00
fs.h Replace deprecated Boost Filesystem function 2019-04-30 10:05:54 +03:00
hash.cpp Extract CSipHasher to it's own file in crypto/ directory. 2018-11-05 09:25:15 -08:00
hash.h Squashed 'src/secp256k1/' changes from 0b70241850..b19c000063 2019-03-31 11:41:05 -07:00
httprpc.cpp Fix occurences of c_str() used with size() to data() 2019-10-28 13:41:45 +01:00
httprpc.h Remove unused includes 2019-10-15 22:56:43 +00:00
httpserver.cpp http: add missing header bootlegged by boost < 1.72 2019-10-25 13:11:09 +00:00
httpserver.h Remove unused includes 2019-10-15 22:56:43 +00:00
indirectmap.h
init.cpp Merge #17286: Fix help-debug -checkpoints 2019-11-01 11:41:45 +01:00
init.h Pass NodeContext, ConnMan, BanMan references more places 2019-10-28 10:30:51 -04:00
key.cpp Make reasoning about dependencies easier by not including unused dependencies 2019-06-02 17:15:23 +02:00
key.h refactor: Remove unused CExt{Pub,}Key (de)serialization methods 2019-10-22 00:07:31 +02:00
key_io.cpp Remove unused includes 2019-10-15 22:56:43 +00:00
key_io.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
limitedmap.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
logging.cpp util: Filter control characters out of log messages 2019-10-15 10:53:17 +02:00
logging.h Replace the LogPrint function with a macro 2019-10-22 13:44:51 -07:00
Makefile.am Merge #16839: Replace Connman and BanMan globals with NodeContext local 2019-10-30 12:35:41 +01:00
Makefile.bench.include Merge #17292: Add new mempool benchmarks for a complex pool 2019-11-01 18:08:41 -04:00
Makefile.leveldb.include build: Remove WINVER pre define in Makefile.leveldb.inlcude 2019-01-26 09:28:48 +08:00
Makefile.qt.include Remove BIP70 Support 2019-10-24 16:01:43 -04:00
Makefile.qt_locale.include qt: Periodic translations update 2019-09-30 09:41:11 +02:00
Makefile.qttest.include Remove BIP70 Support 2019-10-24 16:01:43 -04:00
Makefile.test.include tests: Add fuzzing harness for ISO-8601 related functions 2019-10-30 13:32:29 +00:00
memusage.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
merkleblock.cpp Make reasoning about dependencies easier by not including unused dependencies 2019-06-02 17:15:23 +02:00
merkleblock.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
miner.cpp [validation] Add CValidationState subclasses 2019-10-29 15:46:45 -04:00
miner.h [rpc] mining: Omit uninitialized currentblockweight, currentblocktx 2019-02-12 11:34:57 -05:00
net.cpp Merge #17279: refactor: Remove redundant c_str() calls in formatting 2019-10-28 15:10:06 -04:00
net.h scripted-diff: Remove g_connman, g_banman globals 2019-10-28 10:30:51 -04:00
net_permissions.cpp util: Move ResolveErrMsg to util/error 2019-08-15 10:05:32 -04:00
net_permissions.h Make whitebind/whitelist permissions more flexible 2019-08-11 11:33:27 +09:00
net_processing.cpp Merge #15921: validation: Tidy up ValidationState interface 2019-10-30 15:37:34 +01:00
net_processing.h [validation] Add CValidationState subclasses 2019-10-29 15:46:45 -04:00
netaddress.cpp Fix spelling errors identified by codespell 1.15.0 2019-06-11 17:18:16 +02:00
netaddress.h Remove unused includes 2019-10-15 22:56:43 +00:00
netbase.cpp util: refactor upper/lowercase functions 2019-08-08 11:35:14 +09:00
netbase.h util: refactor upper/lowercase functions 2019-08-08 11:35:14 +09:00
netmessagemaker.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
noui.cpp refactor: Remove redundant c_str() calls in formatting 2019-10-28 13:31:33 +01:00
noui.h Suppress output in test_bitcoin for expected errors 2019-07-03 14:03:21 +02:00
optional.h Remove 'boost::optional'-related gcc warnings 2019-01-30 22:44:28 +02:00
outputtype.cpp Add some general std::vector utility functions 2019-10-16 08:56:57 -07:00
outputtype.h Move various SigningProviders to signingprovider.{cpp,h} 2019-07-09 16:20:18 -04:00
pow.cpp Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
pow.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
prevector.h Remove unused includes 2019-10-15 22:56:43 +00:00
protocol.cpp p2p: Remove BIP61 reject messages 2019-10-02 10:39:14 -04:00
protocol.h Remove unused includes 2019-10-15 22:56:43 +00:00
psbt.cpp Remove unused includes 2019-10-15 22:56:43 +00:00
psbt.h refactor: Replace all uses of boost::optional with our own Optional type 2019-10-30 14:27:31 +01:00
pubkey.cpp Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
pubkey.h refactor: Remove unused CExt{Pub,}Key (de)serialization methods 2019-10-22 00:07:31 +02:00
random.cpp random: remove call to RAND_screen() (Windows only) 2019-10-18 14:24:21 -04:00
random.h Add assertion to randrange that input is not 0 2019-10-28 16:42:39 -07:00
rest.cpp Remove unused includes 2019-10-15 22:56:43 +00:00
reverse_iterator.h scripted-diff: Remove trailing whitespaces 2018-07-24 20:46:23 +01:00
reverselock.h
scheduler.cpp Switch all RNG code to the built-in PRNG. 2019-01-16 16:34:56 -08:00
scheduler.h trivial: correct parameter name in comments 2019-02-10 17:17:32 -05:00
serialize.h Remove unused includes 2019-10-15 22:56:43 +00:00
shutdown.cpp
shutdown.h
span.h Add more methods to Span class 2018-07-27 11:52:18 -07:00
streams.h Remove unused includes 2019-10-15 22:56:43 +00:00
sync.cpp refactor: Remove redundant c_str() calls in formatting 2019-10-28 13:31:33 +01:00
sync.h refactor: consolidate PASTE macros 2019-09-25 10:56:00 -04:00
threadinterrupt.cpp Merge #11640: Make LOCK, LOCK2, TRY_LOCK work with CWaitableCriticalSection 2018-08-31 16:00:38 +02:00
threadinterrupt.h Remove unused includes 2019-10-15 22:56:43 +00:00
threadsafety.h Move LockAnnotation from threadsafety.h (imported code) to sync.h (our code) 2019-05-17 13:29:04 +02:00
timedata.cpp scripted-diff: Make translation bilingual 2019-07-24 16:33:20 +03:00
timedata.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
tinyformat.h tinyformat: Add doc to Bitcoin Core specific strprintf 2019-06-13 09:30:40 -04:00
torcontrol.cpp fix: tor: Call event_base_loopbreak from the event's callback 2019-07-17 15:32:38 +01:00
torcontrol.h Remove unused includes 2019-10-15 22:56:43 +00:00
txdb.cpp Add some general std::vector utility functions 2019-10-16 08:56:57 -07:00
txdb.h Remove unused includes 2019-10-15 22:56:43 +00:00
txmempool.cpp Merge #17316: refactor: Replace all uses of boost::optional with our own Optional type 2019-10-30 14:20:17 -04:00
txmempool.h refactor: Replace all uses of boost::optional with our own Optional type 2019-10-30 14:27:31 +01:00
ui_interface.cpp Merge #16092: Don't use global (external) symbols for symbols that are used in only one translation unit 2019-06-18 15:59:53 -04:00
ui_interface.h Remove unused includes 2019-10-15 22:56:43 +00:00
uint256.cpp Remove unused includes 2019-10-15 22:56:43 +00:00
uint256.h Remove unused includes 2019-10-15 22:56:43 +00:00
undo.h Extract CSipHasher to it's own file in crypto/ directory. 2018-11-05 09:25:15 -08:00
validation.cpp [validation] Remove fMissingInputs from AcceptToMemoryPool() 2019-10-29 15:46:45 -04:00
validation.h [validation] Remove fMissingInputs from AcceptToMemoryPool() 2019-10-29 15:46:45 -04:00
validationinterface.cpp [validation] Add CValidationState subclasses 2019-10-29 15:46:45 -04:00
validationinterface.h [validation] Add CValidationState subclasses 2019-10-29 15:46:45 -04:00
version.h Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
versionbits.cpp doc: Improve versionbits.h documentation 2019-08-15 11:02:55 -04:00
versionbits.h doc: Improve versionbits.h documentation 2019-08-15 11:02:55 -04:00
versionbitsinfo.cpp [Consensus] Bury segwit deployment 2019-08-14 15:52:52 -04:00
versionbitsinfo.h MOVEONLY: Move versionbits info out of versionbits.o 2018-09-23 22:55:11 +02:00
walletinitinterface.h scripted-diff: Rename InitInterfaces to NodeContext 2019-10-28 10:30:51 -04:00
warnings.cpp scripted-diff: Make translation bilingual 2019-07-24 16:33:20 +03:00
warnings.h Remove unused includes 2019-10-15 22:56:43 +00:00