Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix several bugs in array type handling in dotnet module #2064

Merged
merged 1 commit into from
May 2, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions libyara/modules/dotnet/dotnet.c
Original file line number Diff line number Diff line change
Expand Up @@ -581,10 +581,10 @@ static int32_t read_blob_signed(const uint8_t** data, uint32_t* len)
{
uint16_t tmp1 = yr_be16toh(yr_unaligned_u16(*data));
// shift and leave top 2 bits clear
uint16_t tmp2 = (tmp1 >> 1) & 0x3FFF;
int16_t tmp2 = (tmp1 >> 1) & 0x3FFF;
// sign extension in case of negative number
if (tmp1 & 0x1)
tmp2 |= 0xC000;
tmp2 |= 0xE000;

*data += sizeof(uint16_t);
*len -= sizeof(uint16_t);
Expand All @@ -602,10 +602,10 @@ static int32_t read_blob_signed(const uint8_t** data, uint32_t* len)
{
uint32_t tmp1 = yr_be32toh(yr_unaligned_u32(*data));
// shift and leave top 3 bits clear
uint32_t tmp2 = (tmp1 >> 1) & 0x1FFFFFFF;
int32_t tmp2 = (tmp1 >> 1) & 0x1FFFFFFF;
// sign extension in case of negative number
if (tmp1 & 0x1)
tmp2 |= 0xE0000000;
tmp2 |= 0xF0000000;

*data += sizeof(uint32_t);
*len -= sizeof(uint32_t);
Expand Down Expand Up @@ -892,13 +892,15 @@ static char* parse_signature_type(

// Read number of specified sizes
uint32_t num_sizes = read_blob_unsigned(data, len);
sizes = yr_malloc(sizeof(uint32_t) * num_sizes);
if (!sizes || num_sizes > rank)
if (num_sizes > rank)
goto cleanup;
sizes = yr_malloc(sizeof(int64_t) * num_sizes);
if (!sizes)
goto cleanup;

for (uint32_t i = 0; i < num_sizes; ++i)
{
sizes[i] = read_blob_unsigned(data, len);
sizes[i] = (int64_t) read_blob_unsigned(data, len);
}

// Read number of specified lower bounds
Expand All @@ -912,8 +914,8 @@ static char* parse_signature_type(
lo_bounds[i] = read_blob_signed(data, len);

// Adjust higher bound according to lower bound
if (num_sizes > i)
sizes[i] += lo_bounds[i];
if (num_sizes > i && lo_bounds[i] != 0)
sizes[i] += lo_bounds[i] - 1;
}

// Build the resulting array type
Expand All @@ -929,7 +931,7 @@ static char* parse_signature_type(
{
if (num_lowbounds > i && lo_bounds[i] != 0)
sstr_appendf(ss, "%d...", lo_bounds[i]);
if (num_sizes > i && sizes[i] != 0)
if (num_sizes > i)
sstr_appendf(ss, "%d", sizes[i]);
}
if (i + 1 != rank)
Expand Down
Loading