Raise exception when failing deserialization instead of returning false.
Fuzzer preprocessing should provide valid ssz.
This commit is contained in:
parent
dff61c2ea1
commit
0d764d87af
|
@ -13,6 +13,9 @@ type
|
||||||
AttestationInput = object
|
AttestationInput = object
|
||||||
state: BeaconState
|
state: BeaconState
|
||||||
attestation: Attestation
|
attestation: Attestation
|
||||||
|
# This and AssertionError are raised to indicate programming bugs
|
||||||
|
# Used as a wrapper to allow exception tracking to identify unexpected exceptions
|
||||||
|
FuzzCrashError* = object of Exception
|
||||||
|
|
||||||
# TODO: change ptr uint to ptr csize_t when available in newer Nim version.
|
# TODO: change ptr uint to ptr csize_t when available in newer Nim version.
|
||||||
proc copyState(state: BeaconState, output: ptr byte,
|
proc copyState(state: BeaconState, output: ptr byte,
|
||||||
|
@ -32,13 +35,13 @@ proc copyState(state: BeaconState, output: ptr byte,
|
||||||
result = true
|
result = true
|
||||||
|
|
||||||
proc nfuzz_block(input: openArray[byte], output: ptr byte,
|
proc nfuzz_block(input: openArray[byte], output: ptr byte,
|
||||||
output_size: ptr uint): bool {.exportc, raises:[].} =
|
output_size: ptr uint): bool {.exportc, raises:[FuzzCrashError].} =
|
||||||
var data: BlockInput
|
var data: BlockInput
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data = SSZ.decode(input, BlockInput)
|
data = SSZ.decode(input, BlockInput)
|
||||||
except MalformedSszError, SszSizeMismatchError, RangeError:
|
except MalformedSszError, SszSizeMismatchError, RangeError:
|
||||||
return false
|
raise newException(FuzzCrashError, "SSZ deserialisation failed, likely bug in preprocessing.")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = state_transition(data.state, data.beaconBlock, flags = {})
|
result = state_transition(data.state, data.beaconBlock, flags = {})
|
||||||
|
@ -49,7 +52,7 @@ proc nfuzz_block(input: openArray[byte], output: ptr byte,
|
||||||
result = copyState(data.state, output, output_size)
|
result = copyState(data.state, output, output_size)
|
||||||
|
|
||||||
proc nfuzz_attestation(input: openArray[byte], output: ptr byte,
|
proc nfuzz_attestation(input: openArray[byte], output: ptr byte,
|
||||||
output_size: ptr uint): bool {.exportc, raises:[].} =
|
output_size: ptr uint): bool {.exportc, raises:[FuzzCrashError].} =
|
||||||
var
|
var
|
||||||
data: AttestationInput
|
data: AttestationInput
|
||||||
cache = get_empty_per_epoch_cache()
|
cache = get_empty_per_epoch_cache()
|
||||||
|
@ -57,7 +60,7 @@ proc nfuzz_attestation(input: openArray[byte], output: ptr byte,
|
||||||
try:
|
try:
|
||||||
data = SSZ.decode(input, AttestationInput)
|
data = SSZ.decode(input, AttestationInput)
|
||||||
except MalformedSszError, SszSizeMismatchError, RangeError:
|
except MalformedSszError, SszSizeMismatchError, RangeError:
|
||||||
return false
|
raise newException(FuzzCrashError, "SSZ deserialisation failed, likely bug in preprocessing.")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = process_attestation(data.state, data.attestation,
|
result = process_attestation(data.state, data.attestation,
|
||||||
|
|
Loading…
Reference in New Issue