do not access unaligned words/half-words directly
This commit is contained in:
@@ -187,10 +187,11 @@ static bool parse_uint15(private_parser_t *this, int rule_number,
|
|||||||
}
|
}
|
||||||
if (output_pos)
|
if (output_pos)
|
||||||
{
|
{
|
||||||
*output_pos = ntohs(*((u_int16_t*)this->byte_pos)) & ~0x8000;
|
memcpy(output_pos, this->byte_pos, sizeof(u_int16_t));
|
||||||
|
*output_pos = ntohs(*output_pos) & ~0x8000;
|
||||||
DBG3(DBG_ENC, " => %d", *output_pos);
|
DBG3(DBG_ENC, " => %d", *output_pos);
|
||||||
}
|
}
|
||||||
this->byte_pos += 2;
|
this->byte_pos += sizeof(u_int16_t);
|
||||||
this->bit_pos = 0;
|
this->bit_pos = 0;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -211,10 +212,11 @@ static bool parse_uint16(private_parser_t *this, int rule_number,
|
|||||||
}
|
}
|
||||||
if (output_pos)
|
if (output_pos)
|
||||||
{
|
{
|
||||||
*output_pos = ntohs(*((u_int16_t*)this->byte_pos));
|
memcpy(output_pos, this->byte_pos, sizeof(u_int16_t));
|
||||||
|
*output_pos = ntohs(*output_pos);
|
||||||
DBG3(DBG_ENC, " => %d", *output_pos);
|
DBG3(DBG_ENC, " => %d", *output_pos);
|
||||||
}
|
}
|
||||||
this->byte_pos += 2;
|
this->byte_pos += sizeof(u_int16_t);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -233,10 +235,11 @@ static bool parse_uint32(private_parser_t *this, int rule_number,
|
|||||||
}
|
}
|
||||||
if (output_pos)
|
if (output_pos)
|
||||||
{
|
{
|
||||||
*output_pos = ntohl(*((u_int32_t*)this->byte_pos));
|
memcpy(output_pos, this->byte_pos, sizeof(u_int32_t));
|
||||||
|
*output_pos = ntohl(*output_pos);
|
||||||
DBG3(DBG_ENC, " => %d", *output_pos);
|
DBG3(DBG_ENC, " => %d", *output_pos);
|
||||||
}
|
}
|
||||||
this->byte_pos += 4;
|
this->byte_pos += sizeof(u_int32_t);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,7 +264,7 @@ static bool parse_uint64(private_parser_t *this, int rule_number,
|
|||||||
*output_pos = ntohl(*(((u_int32_t*)this->byte_pos) + 1));
|
*output_pos = ntohl(*(((u_int32_t*)this->byte_pos) + 1));
|
||||||
DBG3(DBG_ENC, " => %b", output_pos, sizeof(u_int64_t));
|
DBG3(DBG_ENC, " => %b", output_pos, sizeof(u_int64_t));
|
||||||
}
|
}
|
||||||
this->byte_pos += 8;
|
this->byte_pos += sizeof(u_int64_t);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -508,6 +511,7 @@ static status_t parse_payload(private_parser_t *this,
|
|||||||
pld->destroy(pld);
|
pld->destroy(pld);
|
||||||
return PARSE_ERROR;
|
return PARSE_ERROR;
|
||||||
}
|
}
|
||||||
|
/* parsed u_int16 should be aligned */
|
||||||
payload_length = *(u_int16_t*)(output + rule->offset);
|
payload_length = *(u_int16_t*)(output + rule->offset);
|
||||||
if (payload_length < UNKNOWN_PAYLOAD_HEADER_LENGTH)
|
if (payload_length < UNKNOWN_PAYLOAD_HEADER_LENGTH)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user