Skip to content

Commit

Permalink
[AMF] fix the memory problem (#1247)
Browse files Browse the repository at this point in the history
1. memory corruption
- Overflow num_of_part in SBI message
2. null pointer dereference
- n2InfoContent->ngap_ie_type
  • Loading branch information
acetcom committed Nov 16, 2021
1 parent 6a6f214 commit d919b27
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 17 deletions.
33 changes: 19 additions & 14 deletions lib/sbi/message.c
Original file line number Diff line number Diff line change
Expand Up @@ -924,7 +924,7 @@ static int parse_json(ogs_sbi_message_t *message,
ogs_log_print(OGS_LOG_TRACE, "%s", json);
item = cJSON_Parse(json);
if (!item) {
ogs_error("JSON parse error");
ogs_error("JSON parse error [%s]", json);
return OGS_ERROR;
}

Expand Down Expand Up @@ -1833,18 +1833,16 @@ static int on_header_value(
data = multipart_parser_get_data(parser);
ogs_assert(data);

if (at && length) {
if (data->num_of_part < OGS_SBI_MAX_NUM_OF_PART && at && length) {
SWITCH(data->header_field)
CASE(OGS_SBI_CONTENT_TYPE)
if (data->part[data->num_of_part].content_type)
ogs_free(data->part[data->num_of_part].content_type);
ogs_assert(data->part[data->num_of_part].content_type == NULL);
data->part[data->num_of_part].content_type =
ogs_strndup(at, length);
ogs_assert(data->part[data->num_of_part].content_type);
break;
CASE(OGS_SBI_CONTENT_ID)
if (data->part[data->num_of_part].content_id)
ogs_free(data->part[data->num_of_part].content_id);
ogs_assert(data->part[data->num_of_part].content_id == NULL);
data->part[data->num_of_part].content_id =
ogs_strndup(at, length);
ogs_assert(data->part[data->num_of_part].content_id);
Expand All @@ -1867,7 +1865,7 @@ static int on_part_data(
data = multipart_parser_get_data(parser);
ogs_assert(data);

if (at && length) {
if (data->num_of_part < OGS_SBI_MAX_NUM_OF_PART && at && length) {
SWITCH(data->part[data->num_of_part].content_type)
CASE(OGS_SBI_CONTENT_JSON_TYPE)
CASE(OGS_SBI_CONTENT_5GNAS_TYPE)
Expand Down Expand Up @@ -1901,9 +1899,9 @@ static int on_part_data(
break;

DEFAULT
ogs_log_hexdump(OGS_LOG_FATAL, (unsigned char *)at, length);
ogs_error("Unknown content_type [%s]",
data->part[data->num_of_part].content_type);
ogs_log_hexdump(OGS_LOG_ERROR, (unsigned char *)at, length);
END
}
return 0;
Expand All @@ -1917,7 +1915,9 @@ static int on_part_data_end(multipart_parser *parser)
data = multipart_parser_get_data(parser);
ogs_assert(data);

data->num_of_part++;
if (data->num_of_part < OGS_SBI_MAX_NUM_OF_PART) {
data->num_of_part++;
}

return 0;
}
Expand Down Expand Up @@ -1967,6 +1967,11 @@ static int parse_multipart(
multipart_parser_free(parser);
ogs_free(boundary);

if (data.num_of_part > OGS_SBI_MAX_NUM_OF_PART) {
/* Overflow Issues #1247 */
ogs_fatal("Overflow num_of_part[%d]", data.num_of_part);
ogs_assert_if_reached();
}
for (i = 0; i < data.num_of_part; i++) {
SWITCH(data.part[i].content_type)
CASE(OGS_SBI_CONTENT_JSON_TYPE)
Expand Down Expand Up @@ -2013,14 +2018,14 @@ static int parse_multipart(

DEFAULT
ogs_error("Unknown content-type[%s]", data.part[i].content_type);

if (data.part[i].content_id)
ogs_free(data.part[i].content_id);
if (data.part[i].content_type)
ogs_free(data.part[i].content_type);
END
}

if (data.part[i].content_id)
ogs_free(data.part[i].content_id);
if (data.part[i].content_type)
ogs_free(data.part[i].content_type);

if (data.header_field)
ogs_free(data.header_field);

Expand Down
10 changes: 7 additions & 3 deletions src/amf/namf-handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
OpenAPI_n2_info_content_t *n2InfoContent = NULL;
OpenAPI_ref_to_binary_data_t *ngapData = NULL;

OpenAPI_ngap_ie_type_e ngapIeType = OpenAPI_ngap_ie_type_NULL;

ogs_assert(stream);
ogs_assert(recvmsg);

Expand Down Expand Up @@ -117,12 +119,15 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
ogs_error("No smInfo");
return OGS_ERROR;
}

n2InfoContent = smInfo->n2_info_content;
if (!n2InfoContent) {
ogs_error("No n2InfoContent");
return OGS_ERROR;
}

ngapIeType = n2InfoContent->ngap_ie_type;

ngapData = n2InfoContent->ngap_data;
if (!ngapData || !ngapData->content_id) {
ogs_error("No ngapData");
Expand Down Expand Up @@ -153,7 +158,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer(

sendmsg.N1N2MessageTransferRspData = &N1N2MessageTransferRspData;

switch (n2InfoContent->ngap_ie_type) {
switch (ngapIeType) {
case OpenAPI_ngap_ie_type_PDU_RES_SETUP_REQ:
if (!n2buf) {
ogs_error("[%s] No N2 SM Content", amf_ue->supi);
Expand Down Expand Up @@ -390,8 +395,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
break;

default:
ogs_error("Not implemented ngap_ie_type[%d]",
n2InfoContent->ngap_ie_type);
ogs_error("Not implemented ngapIeType[%d]", ngapIeType);
ogs_assert_if_reached();
}

Expand Down

0 comments on commit d919b27

Please sign in to comment.