@@ -164,20 +164,7 @@ template <typename WeakEnumType, size_t size>
164
164
return UintToArith256 (ConsumeUInt256 (fuzzed_data_provider));
165
165
}
166
166
167
- [[nodiscard]] inline CTxMemPoolEntry ConsumeTxMemPoolEntry (FuzzedDataProvider& fuzzed_data_provider, const CTransaction& tx) noexcept
168
- {
169
- // Avoid:
170
- // policy/feerate.cpp:28:34: runtime error: signed integer overflow: 34873208148477500 * 1000 cannot be represented in type 'long'
171
- //
172
- // Reproduce using CFeeRate(348732081484775, 10).GetFeePerK()
173
- const CAmount fee = std::min<CAmount>(ConsumeMoney (fuzzed_data_provider), std::numeric_limits<CAmount>::max () / static_cast <CAmount>(100000 ));
174
- assert (MoneyRange (fee));
175
- const int64_t time = fuzzed_data_provider.ConsumeIntegral <int64_t >();
176
- const unsigned int entry_height = fuzzed_data_provider.ConsumeIntegral <unsigned int >();
177
- const bool spends_coinbase = fuzzed_data_provider.ConsumeBool ();
178
- const unsigned int sig_op_cost = fuzzed_data_provider.ConsumeIntegralInRange <unsigned int >(0 , MAX_BLOCK_SIGOPS_COST);
179
- return CTxMemPoolEntry{MakeTransactionRef (tx), fee, time , entry_height, spends_coinbase, sig_op_cost, {}};
180
- }
167
+ [[nodiscard]] CTxMemPoolEntry ConsumeTxMemPoolEntry (FuzzedDataProvider& fuzzed_data_provider, const CTransaction& tx) noexcept ;
181
168
182
169
[[nodiscard]] CTxDestination ConsumeTxDestination (FuzzedDataProvider& fuzzed_data_provider) noexcept ;
183
170
@@ -215,16 +202,7 @@ template <class T>
215
202
return std::numeric_limits<T>::max () - i < j;
216
203
}
217
204
218
- [[nodiscard]] inline bool ContainsSpentInput (const CTransaction& tx, const CCoinsViewCache& inputs) noexcept
219
- {
220
- for (const CTxIn& tx_in : tx.vin ) {
221
- const Coin& coin = inputs.AccessCoin (tx_in.prevout );
222
- if (coin.IsSpent ()) {
223
- return true ;
224
- }
225
- }
226
- return false ;
227
- }
205
+ [[nodiscard]] bool ContainsSpentInput (const CTransaction& tx, const CCoinsViewCache& inputs) noexcept ;
228
206
229
207
/* *
230
208
* Sets errno to a value selected from the given std::array `errnos`.
@@ -259,27 +237,7 @@ inline void SetFuzzedErrNo(FuzzedDataProvider& fuzzed_data_provider) noexcept
259
237
return result;
260
238
}
261
239
262
- inline CNetAddr ConsumeNetAddr (FuzzedDataProvider& fuzzed_data_provider) noexcept
263
- {
264
- const Network network = fuzzed_data_provider.PickValueInArray ({Network::NET_IPV4, Network::NET_IPV6, Network::NET_INTERNAL, Network::NET_ONION});
265
- CNetAddr net_addr;
266
- if (network == Network::NET_IPV4) {
267
- in_addr v4_addr = {};
268
- v4_addr.s_addr = fuzzed_data_provider.ConsumeIntegral <uint32_t >();
269
- net_addr = CNetAddr{v4_addr};
270
- } else if (network == Network::NET_IPV6) {
271
- if (fuzzed_data_provider.remaining_bytes () >= 16 ) {
272
- in6_addr v6_addr = {};
273
- memcpy (v6_addr.s6_addr , fuzzed_data_provider.ConsumeBytes <uint8_t >(16 ).data (), 16 );
274
- net_addr = CNetAddr{v6_addr, fuzzed_data_provider.ConsumeIntegral <uint32_t >()};
275
- }
276
- } else if (network == Network::NET_INTERNAL) {
277
- net_addr.SetInternal (fuzzed_data_provider.ConsumeBytesAsString (32 ));
278
- } else if (network == Network::NET_ONION) {
279
- net_addr.SetSpecial (fuzzed_data_provider.ConsumeBytesAsString (32 ));
280
- }
281
- return net_addr;
282
- }
240
+ CNetAddr ConsumeNetAddr (FuzzedDataProvider& fuzzed_data_provider) noexcept ;
283
241
284
242
inline CSubNet ConsumeSubNet (FuzzedDataProvider& fuzzed_data_provider) noexcept
285
243
{
@@ -329,112 +287,15 @@ class FuzzedFileProvider
329
287
{
330
288
}
331
289
332
- FILE* open ()
333
- {
334
- SetFuzzedErrNo (m_fuzzed_data_provider);
335
- if (m_fuzzed_data_provider.ConsumeBool ()) {
336
- return nullptr ;
337
- }
338
- std::string mode;
339
- CallOneOf (
340
- m_fuzzed_data_provider,
341
- [&] {
342
- mode = " r" ;
343
- },
344
- [&] {
345
- mode = " r+" ;
346
- },
347
- [&] {
348
- mode = " w" ;
349
- },
350
- [&] {
351
- mode = " w+" ;
352
- },
353
- [&] {
354
- mode = " a" ;
355
- },
356
- [&] {
357
- mode = " a+" ;
358
- });
359
- #if defined _GNU_SOURCE && !defined __ANDROID__
360
- const cookie_io_functions_t io_hooks = {
361
- FuzzedFileProvider::read ,
362
- FuzzedFileProvider::write ,
363
- FuzzedFileProvider::seek,
364
- FuzzedFileProvider::close ,
365
- };
366
- return fopencookie (this , mode.c_str (), io_hooks);
367
- #else
368
- (void )mode;
369
- return nullptr ;
370
- #endif
371
- }
290
+ FILE* open ();
372
291
373
- static ssize_t read (void * cookie, char * buf, size_t size)
374
- {
375
- FuzzedFileProvider* fuzzed_file = (FuzzedFileProvider*)cookie;
376
- SetFuzzedErrNo (fuzzed_file->m_fuzzed_data_provider );
377
- if (buf == nullptr || size == 0 || fuzzed_file->m_fuzzed_data_provider .ConsumeBool ()) {
378
- return fuzzed_file->m_fuzzed_data_provider .ConsumeBool () ? 0 : -1 ;
379
- }
380
- const std::vector<uint8_t > random_bytes = fuzzed_file->m_fuzzed_data_provider .ConsumeBytes <uint8_t >(size);
381
- if (random_bytes.empty ()) {
382
- return 0 ;
383
- }
384
- std::memcpy (buf, random_bytes.data (), random_bytes.size ());
385
- if (AdditionOverflow (fuzzed_file->m_offset , (int64_t )random_bytes.size ())) {
386
- return fuzzed_file->m_fuzzed_data_provider .ConsumeBool () ? 0 : -1 ;
387
- }
388
- fuzzed_file->m_offset += random_bytes.size ();
389
- return random_bytes.size ();
390
- }
292
+ static ssize_t read (void * cookie, char * buf, size_t size);
391
293
392
- static ssize_t write (void * cookie, const char * buf, size_t size)
393
- {
394
- FuzzedFileProvider* fuzzed_file = (FuzzedFileProvider*)cookie;
395
- SetFuzzedErrNo (fuzzed_file->m_fuzzed_data_provider );
396
- const ssize_t n = fuzzed_file->m_fuzzed_data_provider .ConsumeIntegralInRange <ssize_t >(0 , size);
397
- if (AdditionOverflow (fuzzed_file->m_offset , (int64_t )n)) {
398
- return fuzzed_file->m_fuzzed_data_provider .ConsumeBool () ? 0 : -1 ;
399
- }
400
- fuzzed_file->m_offset += n;
401
- return n;
402
- }
294
+ static ssize_t write (void * cookie, const char * buf, size_t size);
403
295
404
- static int seek (void * cookie, int64_t * offset, int whence)
405
- {
406
- assert (whence == SEEK_SET || whence == SEEK_CUR || whence == SEEK_END);
407
- FuzzedFileProvider* fuzzed_file = (FuzzedFileProvider*)cookie;
408
- SetFuzzedErrNo (fuzzed_file->m_fuzzed_data_provider );
409
- int64_t new_offset = 0 ;
410
- if (whence == SEEK_SET) {
411
- new_offset = *offset;
412
- } else if (whence == SEEK_CUR) {
413
- if (AdditionOverflow (fuzzed_file->m_offset , *offset)) {
414
- return -1 ;
415
- }
416
- new_offset = fuzzed_file->m_offset + *offset;
417
- } else if (whence == SEEK_END) {
418
- const int64_t n = fuzzed_file->m_fuzzed_data_provider .ConsumeIntegralInRange <int64_t >(0 , 4096 );
419
- if (AdditionOverflow (n, *offset)) {
420
- return -1 ;
421
- }
422
- new_offset = n + *offset;
423
- }
424
- if (new_offset < 0 ) {
425
- return -1 ;
426
- }
427
- fuzzed_file->m_offset = new_offset;
428
- *offset = new_offset;
429
- return fuzzed_file->m_fuzzed_data_provider .ConsumeIntegralInRange <int >(-1 , 0 );
430
- }
296
+ static int seek (void * cookie, int64_t * offset, int whence);
431
297
432
- static int close (void * cookie)
433
- {
434
- FuzzedFileProvider* fuzzed_file = (FuzzedFileProvider*)cookie;
435
- SetFuzzedErrNo (fuzzed_file->m_fuzzed_data_provider );
436
- return fuzzed_file->m_fuzzed_data_provider .ConsumeIntegralInRange <int >(-1 , 0 );
437
- }
298
+ static int close (void * cookie);
438
299
};
439
300
440
301
[[nodiscard]] inline FuzzedFileProvider ConsumeFile (FuzzedDataProvider& fuzzed_data_provider) noexcept
0 commit comments