Branch data Line data Source code
1 : : // Copyright (c) 2009-2022 The Bitcoin Core developers 2 : : // Distributed under the MIT software license, see the accompanying 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : : 5 : : #include <chainparams.h> 6 : : #include <rpc/client.h> 7 : : #include <rpc/util.h> 8 : : #include <test/fuzz/fuzz.h> 9 : : #include <util/chaintype.h> 10 : : 11 : : #include <limits> 12 : : #include <string> 13 : : 14 : 1 : void initialize_parse_univalue() 15 : : { 16 : 1 : SelectParams(ChainType::REGTEST); 17 [ + - ]: 174 : } 18 [ + - ]: 173 : 19 [ + - - + ]: 1534 : FUZZ_TARGET(parse_univalue, .init = initialize_parse_univalue) 20 : : { 21 [ + - ]: 1188 : const std::string random_string(buffer.begin(), buffer.end()); 22 : 1188 : bool valid = true; 23 [ + - ]: 2376 : const UniValue univalue = [&] { 24 : 1188 : UniValue uv; 25 [ + - + + ]: 1188 : if (!uv.read(random_string)) valid = false; 26 [ + + + - : 1188 : return valid ? uv : UniValue{}; + - ] 27 : 1361 : }(); 28 [ + + ]: 1188 : if (!valid) { 29 : 188 : return; 30 : : } 31 : : try { 32 [ + - + + ]: 1000 : (void)ParseHashO(univalue, "A"); 33 [ + + + - ]: 1000 : } catch (const UniValue&) { 34 [ + - ]: 8 : } catch (const std::runtime_error&) { 35 [ + - ]: 997 : } 36 : : try { 37 [ + - - + ]: 1000 : (void)ParseHashO(univalue, random_string); 38 [ - + + - ]: 1000 : } catch (const UniValue&) { 39 [ # # ]: 0 : } catch (const std::runtime_error&) { 40 [ + - ]: 1000 : } 41 : : try { 42 [ + - + + ]: 1000 : (void)ParseHashV(univalue, "A"); 43 [ + + + - ]: 1000 : } catch (const UniValue&) { 44 [ + - ]: 877 : } catch (const std::runtime_error&) { 45 [ + - ]: 997 : } 46 : : try { 47 [ + - + + ]: 1000 : (void)ParseHashV(univalue, random_string); 48 [ + + + - ]: 1000 : } catch (const UniValue&) { 49 [ + - ]: 877 : } catch (const std::runtime_error&) { 50 [ + - ]: 997 : } 51 : : try { 52 [ + - + + ]: 1000 : (void)ParseHexO(univalue, "A"); 53 [ + - ]: 1000 : } catch (const UniValue&) { 54 [ + - ]: 997 : } 55 : : try { 56 [ + - - + ]: 1000 : (void)ParseHexO(univalue, random_string); 57 [ + - ]: 1000 : } catch (const UniValue&) { 58 [ + - ]: 1000 : } 59 : : try { 60 [ + - + + ]: 1000 : (void)ParseHexV(univalue, "A"); 61 [ + - # # ]: 1000 : } catch (const UniValue&) { 62 [ + - ]: 990 : } catch (const std::runtime_error&) { 63 [ # # ]: 990 : } 64 : : try { 65 [ + - + + ]: 1000 : (void)ParseHexV(univalue, random_string); 66 [ + - # # ]: 1000 : } catch (const UniValue&) { 67 [ + - ]: 990 : } catch (const std::runtime_error&) { 68 [ # # ]: 990 : } 69 : : try { 70 [ + - + + : 1000 : if (univalue.isNull() || univalue.isStr()) (void)ParseSighashString(univalue); + - + + + + ] 71 [ - + ]: 1000 : } catch (const UniValue&) { 72 [ + - ]: 879 : } 73 : : try { 74 [ + + ]: 1173 : (void)AmountFromValue(univalue); 75 [ + - # # ]: 1000 : } catch (const UniValue&) { 76 [ + - ]: 978 : } catch (const std::runtime_error&) { 77 [ # # ]: 978 : } 78 : : try { 79 : 1000 : FlatSigningProvider provider; 80 [ + + ]: 1000 : (void)EvalDescriptorStringOrObject(univalue, provider); 81 [ + + + - ]: 1000 : } catch (const UniValue&) { 82 [ + - ]: 833 : } catch (const std::runtime_error&) { 83 [ + - ]: 835 : } 84 : : try { 85 [ + + ]: 1000 : (void)ParseConfirmTarget(univalue, std::numeric_limits<unsigned int>::max()); 86 [ + + + - ]: 1000 : } catch (const UniValue&) { 87 [ + - ]: 2 : } catch (const std::runtime_error&) { 88 [ + - ]: 992 : } 89 : : try { 90 [ + + ]: 1000 : (void)ParseDescriptorRange(univalue); 91 [ + + + - ]: 1000 : } catch (const UniValue&) { 92 [ + - ]: 960 : } catch (const std::runtime_error&) { 93 [ + - ]: 992 : } 94 [ - + ]: 13832 : }