mirror of
https://github.com/trailofbits/buttercup
synced 2026-06-21 14:11:39 +00:00
776732d017
* program-model: use module scoped CodeQuery * fix also sqlite tests * fix antlr4 test * wip * Fix macros test * appease linting gods * Fix cleanup routine --------- Co-authored-by: Henrik Brodin <90325907+hbrodin@users.noreply.github.com> Co-authored-by: Evan Downing <2077950+evandowning@users.noreply.github.com> Co-authored-by: Michael D. Brown <michael.brown@trailofbits.com>
267 lines
6.3 KiB
Python
267 lines
6.3 KiB
Python
import pytest
|
|
|
|
from buttercup.common.challenge_task import ChallengeTask
|
|
from buttercup.program_model.codequery import CodeQuery
|
|
from ..common import (
|
|
common_test_get_callers,
|
|
common_test_get_callees,
|
|
common_test_get_functions,
|
|
common_test_get_type_definitions,
|
|
common_test_get_type_usages,
|
|
TestFunctionInfo,
|
|
TestCalleeInfo,
|
|
TestCallerInfo,
|
|
TestTypeDefinitionInfo,
|
|
TestTypeUsageInfo,
|
|
TypeDefinitionType,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"function_name,file_path,function_info",
|
|
[
|
|
(
|
|
"freerdp_assistance_parse_file_buffer",
|
|
"/src/FreeRDP/libfreerdp/common/assistance.c",
|
|
TestFunctionInfo(
|
|
num_bodies=1,
|
|
body_excerpts=[
|
|
"""if (!file->PassStub)
|
|
return -1;
|
|
|
|
if (amp)
|
|
{
|
|
// just skip over "amp;" leaving "&"
|
|
CopyMemory(file->PassStub, p, amp - p + 1);
|
|
CopyMemory(file->PassStub + (amp - p + 1), amp + 5, q - amp + 5);
|
|
}
|
|
else
|
|
{
|
|
CopyMemory(file->PassStub, p, length);
|
|
}""",
|
|
],
|
|
),
|
|
),
|
|
],
|
|
)
|
|
@pytest.mark.integration
|
|
def test_get_functions(
|
|
freerdp_oss_fuzz_task: ChallengeTask,
|
|
freerdp_oss_fuzz_cq: CodeQuery,
|
|
function_name,
|
|
file_path,
|
|
function_info,
|
|
):
|
|
"""Test that we can get functions in challenge task code"""
|
|
common_test_get_functions(
|
|
freerdp_oss_fuzz_cq, function_name, file_path, function_info
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"function_name,file_path,line_number,fuzzy,expected_callers,num_callers",
|
|
[
|
|
(
|
|
"freerdp_assistance_parse_file_buffer",
|
|
"/src/FreeRDP/libfreerdp/common/assistance.c",
|
|
None,
|
|
False,
|
|
[
|
|
TestCallerInfo(
|
|
name="parse_file_buffer",
|
|
file_path="/src/FreeRDP/libfreerdp/common/test/TestFuzzCommonAssistanceParseFileBuffer.c",
|
|
start_line=3,
|
|
),
|
|
],
|
|
4,
|
|
),
|
|
],
|
|
)
|
|
@pytest.mark.integration
|
|
def test_get_callers(
|
|
freerdp_oss_fuzz_task: ChallengeTask,
|
|
freerdp_oss_fuzz_cq: CodeQuery,
|
|
function_name,
|
|
file_path,
|
|
line_number,
|
|
fuzzy,
|
|
expected_callers,
|
|
num_callers,
|
|
):
|
|
"""Test that we can get function callers."""
|
|
common_test_get_callers(
|
|
freerdp_oss_fuzz_task,
|
|
freerdp_oss_fuzz_cq,
|
|
function_name,
|
|
file_path,
|
|
line_number,
|
|
fuzzy,
|
|
expected_callers,
|
|
num_callers,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"function_name,file_path,line_number,fuzzy,expected_callees,num_callees",
|
|
[
|
|
(
|
|
"freerdp_assistance_parse_file_buffer",
|
|
"/src/FreeRDP/libfreerdp/common/assistance.c",
|
|
None,
|
|
False,
|
|
[
|
|
TestCalleeInfo(
|
|
name="freerdp_assistance_parse_connection_string1",
|
|
file_path="/src/FreeRDP/libfreerdp/common/assistance.c",
|
|
start_line=214,
|
|
),
|
|
],
|
|
6,
|
|
),
|
|
],
|
|
)
|
|
@pytest.mark.integration
|
|
def test_get_callees(
|
|
freerdp_oss_fuzz_task: ChallengeTask,
|
|
freerdp_oss_fuzz_cq: CodeQuery,
|
|
function_name,
|
|
file_path,
|
|
line_number,
|
|
fuzzy,
|
|
expected_callees,
|
|
num_callees,
|
|
):
|
|
"""Test that we can get function callees."""
|
|
common_test_get_callees(
|
|
freerdp_oss_fuzz_task,
|
|
freerdp_oss_fuzz_cq,
|
|
function_name,
|
|
file_path,
|
|
line_number,
|
|
fuzzy,
|
|
expected_callees,
|
|
num_callees,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"type_name,file_path,fuzzy,type_definition_info",
|
|
[
|
|
(
|
|
"rdp_assistance_file",
|
|
None,
|
|
False,
|
|
TestTypeDefinitionInfo(
|
|
name="rdp_assistance_file",
|
|
type=TypeDefinitionType.STRUCT,
|
|
definition="""struct rdp_assistance_file
|
|
{
|
|
UINT32 Type;
|
|
|
|
char* Username;
|
|
char* LHTicket;
|
|
char* RCTicket;
|
|
char* PassStub;
|
|
UINT32 DtStart;
|
|
UINT32 DtLength;
|
|
BOOL LowSpeed;
|
|
BOOL RCTicketEncrypted;
|
|
|
|
char* ConnectionString1;
|
|
char* ConnectionString2;
|
|
|
|
BYTE* EncryptedPassStub;
|
|
size_t EncryptedPassStubLength;
|
|
|
|
BYTE* EncryptedLHTicket;
|
|
size_t EncryptedLHTicketLength;
|
|
|
|
UINT32 MachineCount;
|
|
char** MachineAddresses;
|
|
UINT32* MachinePorts;
|
|
|
|
char* RASessionId;
|
|
char* RASpecificParams;
|
|
|
|
char* filename;
|
|
char* password;
|
|
}""",
|
|
definition_line=40,
|
|
file_path="/src/FreeRDP/libfreerdp/common/assistance.c",
|
|
),
|
|
),
|
|
(
|
|
"rdpAssistanceFile",
|
|
None,
|
|
False,
|
|
TestTypeDefinitionInfo(
|
|
name="rdpAssistanceFile",
|
|
type=TypeDefinitionType.TYPEDEF,
|
|
definition="""typedef struct rdp_assistance_file rdpAssistanceFile;""",
|
|
definition_line=32,
|
|
file_path="/src/FreeRDP/include/freerdp/assistance.h",
|
|
),
|
|
),
|
|
],
|
|
)
|
|
@pytest.mark.integration
|
|
def test_get_type_definitions(
|
|
freerdp_oss_fuzz_task: ChallengeTask,
|
|
freerdp_oss_fuzz_cq: CodeQuery,
|
|
type_name,
|
|
file_path,
|
|
fuzzy,
|
|
type_definition_info,
|
|
):
|
|
"""Test that we can get type defs"""
|
|
common_test_get_type_definitions(
|
|
freerdp_oss_fuzz_task,
|
|
freerdp_oss_fuzz_cq,
|
|
type_name,
|
|
file_path,
|
|
fuzzy,
|
|
type_definition_info,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"type_name,file_path,fuzzy,type_usage_infos,num_type_usages",
|
|
[
|
|
(
|
|
"rdpAssistanceFile",
|
|
None,
|
|
False,
|
|
[
|
|
TestTypeUsageInfo(
|
|
file_path="/src/FreeRDP/server/shadow/Win/win_wds.c",
|
|
line_number=531,
|
|
),
|
|
],
|
|
6,
|
|
),
|
|
],
|
|
)
|
|
@pytest.mark.skip(
|
|
reason="Problem with codequery. Doesn't consider rdpAssistanceFile as being used"
|
|
)
|
|
@pytest.mark.integration
|
|
def test_get_type_usages(
|
|
freerdp_oss_fuzz_task: ChallengeTask,
|
|
freerdp_oss_fuzz_cq: CodeQuery,
|
|
type_name,
|
|
file_path,
|
|
fuzzy,
|
|
type_usage_infos,
|
|
num_type_usages,
|
|
):
|
|
"""Test that we can get function callees from zookeeper"""
|
|
common_test_get_type_usages(
|
|
freerdp_oss_fuzz_task,
|
|
freerdp_oss_fuzz_cq,
|
|
type_name,
|
|
file_path,
|
|
fuzzy,
|
|
type_usage_infos,
|
|
num_type_usages,
|
|
)
|