diff --git a/src/include/deepstate/DeepState.h b/src/include/deepstate/DeepState.h index baf3e0b9..b1dcd42f 100644 --- a/src/include/deepstate/DeepState.h +++ b/src/include/deepstate/DeepState.h @@ -259,6 +259,9 @@ extern const char *DeepState_ConcretizeCStr(const char *begin); /* Allocate and return a pointer to `num_bytes` symbolic bytes. */ extern void *DeepState_Malloc(size_t num_bytes); +/* Allocate all the concrete inputs and return a pointer to `num_bytes` symbolic bytes. */ +extern void *DeepState_MallocAll(size_t *num_bytes); + /* Allocate and return a pointer to `num_bytes` symbolic bytes. Ptr will be freed by DeepState at end of test. */ extern void *DeepState_GCMalloc(size_t num_bytes); diff --git a/src/lib/DeepState.c b/src/lib/DeepState.c index 2494ebaa..89978e6a 100644 --- a/src/lib/DeepState.c +++ b/src/lib/DeepState.c @@ -3,8 +3,7 @@ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * + * You may obtain a copy of the Licen * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software @@ -86,6 +85,9 @@ static struct DeepState_TestInfo *DeepState_DrFuzzTest = NULL; /* Initialize global input buffer and index / initialized index. */ volatile uint8_t DeepState_Input[DeepState_InputSize] = {}; uint32_t DeepState_InputIndex = 0; + +uint32_t DeepState_ConcreteInputIndex = 0; + uint32_t DeepState_InputInitialized = 0; /* Used if we need to generate on-the-fly data while we fuzz */ @@ -394,6 +396,14 @@ void *DeepState_Malloc(size_t num_bytes) { return data; } +/* Allocate all the available concrete input, update the `num_bytes` pointer and return + * a pointer to symbolic bytes. */ +void *DeepState_MallocAll(size_t *num_bytes) { + *num_bytes = DeepState_ConcreteInputIndex; + DeepState_ConcreteInputIndex = 0; + return DeepState_Malloc(*num_bytes); +} + /* Allocate and return a pointer to `num_bytes` symbolic bytes. */ void *DeepState_GCMalloc(size_t num_bytes) { void *data = malloc(num_bytes); @@ -1165,6 +1175,7 @@ extern int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { DeepState_SwarmConfigsIndex = 0; memcpy((void *) DeepState_Input, (void *) Data, Size); + DeepState_ConcreteInputIndex = Size; DeepState_InputInitialized = Size; DeepState_Begin(test);