[NRF] fix the crash for invalid FQDN (#1333)
This commit is contained in:
parent
68407efa16
commit
866ae78f5e
|
@ -327,8 +327,9 @@ int ogs_fqdn_parse(char *dst, char *src, int length)
|
||||||
while (i+1 < length) {
|
while (i+1 < length) {
|
||||||
len = src[i++];
|
len = src[i++];
|
||||||
if ((j + len + 1) > length) {
|
if ((j + len + 1) > length) {
|
||||||
ogs_error("Invalid APN encoding[len:%d] + 1 > length[%d]",
|
ogs_error("Invalid FQDN encoding[len:%d] + 1 > length[%d]",
|
||||||
len, length);
|
len, length);
|
||||||
|
ogs_log_hexdump(OGS_LOG_ERROR, (unsigned char *)src, length);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memcpy(&dst[j], &src[i], len);
|
memcpy(&dst[j], &src[i], len);
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.2.0
|
* This file had been created by nas-message.py script v0.2.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-10-13 22:57:17.425900 by acetcom
|
* Created on: 2022-01-22 09:24:09.045630 by acetcom
|
||||||
* from 24501-g41.docx
|
* from 24501-g41.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.2.0
|
* This file had been created by nas-message.py script v0.2.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-10-13 22:57:17.434442 by acetcom
|
* Created on: 2022-01-22 09:24:09.053958 by acetcom
|
||||||
* from 24501-g41.docx
|
* from 24501-g41.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.2.0
|
* This file had been created by nas-message.py script v0.2.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-10-13 22:57:17.413540 by acetcom
|
* Created on: 2022-01-22 09:24:09.032504 by acetcom
|
||||||
* from 24501-g41.docx
|
* from 24501-g41.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
@ -135,13 +135,13 @@ int ogs_nas_5gs_decode_dnn(ogs_nas_dnn_t *dnn, ogs_pkbuf_t *pkbuf)
|
||||||
memcpy(dnn, pkbuf->data - size, size);
|
memcpy(dnn, pkbuf->data - size, size);
|
||||||
|
|
||||||
{
|
{
|
||||||
char data_network_name[OGS_MAX_DNN_LEN];
|
char data_network_name[OGS_MAX_DNN_LEN+1];
|
||||||
dnn->length = ogs_fqdn_parse(data_network_name, dnn->value, ogs_min(dnn->length, OGS_MAX_DNN_LEN+1));
|
dnn->length = ogs_fqdn_parse(data_network_name, dnn->value, ogs_min(dnn->length, OGS_MAX_DNN_LEN));
|
||||||
if (dnn->length > 0) {
|
if (dnn->length > 0) {
|
||||||
ogs_cpystrn(dnn->value, data_network_name, ogs_min(dnn->length, OGS_MAX_DNN_LEN) + 1);
|
ogs_cpystrn(dnn->value, data_network_name, ogs_min(dnn->length, OGS_MAX_DNN_LEN)+1);
|
||||||
} else {
|
} else {
|
||||||
ogs_error("UE not APN setting");
|
ogs_error("UE not APN setting");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_trace(" DNN - ");
|
ogs_trace(" DNN - ");
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.2.0
|
* This file had been created by nas-message.py script v0.2.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-10-13 22:57:17.411445 by acetcom
|
* Created on: 2022-01-22 09:24:09.029942 by acetcom
|
||||||
* from 24501-g41.docx
|
* from 24501-g41.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.2.0
|
* This file had been created by nas-message.py script v0.2.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-10-13 22:57:17.420408 by acetcom
|
* Created on: 2022-01-22 09:24:09.040249 by acetcom
|
||||||
* from 24501-g41.docx
|
* from 24501-g41.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ type_list["Header compression configuration"]["encode"] = \
|
||||||
type_list["DNN"]["decode"] = \
|
type_list["DNN"]["decode"] = \
|
||||||
" {\n" \
|
" {\n" \
|
||||||
" char data_network_name[OGS_MAX_DNN_LEN+1];\n" \
|
" char data_network_name[OGS_MAX_DNN_LEN+1];\n" \
|
||||||
" dnn->length = ogs_fqdn_parse(data_network_name, dnn->value, ogs_min(dnn->length, OGS_MAX_DNN_LEN+1));\n" \
|
" dnn->length = ogs_fqdn_parse(data_network_name, dnn->value, ogs_min(dnn->length, OGS_MAX_DNN_LEN));\n" \
|
||||||
" if (dnn->length > 0) {\n" \
|
" if (dnn->length > 0) {\n" \
|
||||||
" ogs_cpystrn(dnn->value, data_network_name, ogs_min(dnn->length, OGS_MAX_DNN_LEN)+1);\n" \
|
" ogs_cpystrn(dnn->value, data_network_name, ogs_min(dnn->length, OGS_MAX_DNN_LEN)+1);\n" \
|
||||||
" } else {\n" \
|
" } else {\n" \
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.1.0
|
* This file had been created by nas-message.py script v0.1.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-11-15 15:24:45.981268 by acetcom
|
* Created on: 2022-01-22 09:24:28.380730 by acetcom
|
||||||
* from 24301-g40.docx
|
* from 24301-g40.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.1.0
|
* This file had been created by nas-message.py script v0.1.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-11-15 15:24:45.990017 by acetcom
|
* Created on: 2022-01-22 09:24:28.390156 by acetcom
|
||||||
* from 24301-g40.docx
|
* from 24301-g40.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.1.0
|
* This file had been created by nas-message.py script v0.1.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-11-15 15:24:45.969895 by acetcom
|
* Created on: 2022-01-22 09:24:28.368722 by acetcom
|
||||||
* from 24301-g40.docx
|
* from 24301-g40.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
@ -3014,7 +3014,7 @@ int ogs_nas_eps_decode_access_point_name(ogs_nas_access_point_name_t *access_poi
|
||||||
|
|
||||||
{
|
{
|
||||||
char apn[OGS_MAX_APN_LEN+1];
|
char apn[OGS_MAX_APN_LEN+1];
|
||||||
access_point_name->length = ogs_fqdn_parse(apn, access_point_name->apn, ogs_min(access_point_name->length, OGS_MAX_APN_LEN+1));
|
access_point_name->length = ogs_fqdn_parse(apn, access_point_name->apn, ogs_min(access_point_name->length, OGS_MAX_APN_LEN));
|
||||||
if (access_point_name->length > 0) {
|
if (access_point_name->length > 0) {
|
||||||
ogs_cpystrn(access_point_name->apn, apn, ogs_min(access_point_name->length, OGS_MAX_APN_LEN)+1);
|
ogs_cpystrn(access_point_name->apn, apn, ogs_min(access_point_name->length, OGS_MAX_APN_LEN)+1);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.1.0
|
* This file had been created by nas-message.py script v0.1.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-11-15 15:24:45.968168 by acetcom
|
* Created on: 2022-01-22 09:24:28.366939 by acetcom
|
||||||
* from 24301-g40.docx
|
* from 24301-g40.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* This file had been created by nas-message.py script v0.1.0
|
* This file had been created by nas-message.py script v0.1.0
|
||||||
* Please do not modify this file but regenerate it via script.
|
* Please do not modify this file but regenerate it via script.
|
||||||
* Created on: 2021-11-15 15:24:45.975004 by acetcom
|
* Created on: 2022-01-22 09:24:28.374281 by acetcom
|
||||||
* from 24301-g40.docx
|
* from 24301-g40.docx
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ type_list["Short MAC"]["encode"] = \
|
||||||
type_list["Access point name"]["decode"] = \
|
type_list["Access point name"]["decode"] = \
|
||||||
" {\n" \
|
" {\n" \
|
||||||
" char apn[OGS_MAX_APN_LEN+1];\n" \
|
" char apn[OGS_MAX_APN_LEN+1];\n" \
|
||||||
" access_point_name->length = ogs_fqdn_parse(apn, access_point_name->apn, ogs_min(access_point_name->length, OGS_MAX_APN_LEN+1));\n" \
|
" access_point_name->length = ogs_fqdn_parse(apn, access_point_name->apn, ogs_min(access_point_name->length, OGS_MAX_APN_LEN));\n" \
|
||||||
" if (access_point_name->length > 0) {\n" \
|
" if (access_point_name->length > 0) {\n" \
|
||||||
" ogs_cpystrn(access_point_name->apn, apn, ogs_min(access_point_name->length, OGS_MAX_APN_LEN)+1);\n" \
|
" ogs_cpystrn(access_point_name->apn, apn, ogs_min(access_point_name->length, OGS_MAX_APN_LEN)+1);\n" \
|
||||||
" } else {\n" \
|
" } else {\n" \
|
||||||
|
|
|
@ -421,7 +421,7 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_create_pdr(ogs_pfcp_sess_t *sess,
|
||||||
|
|
||||||
ogs_assert(0 < ogs_fqdn_parse(dnn,
|
ogs_assert(0 < ogs_fqdn_parse(dnn,
|
||||||
message->pdi.network_instance.data,
|
message->pdi.network_instance.data,
|
||||||
ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN+1)));
|
ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN)));
|
||||||
|
|
||||||
pdr->dnn = ogs_strdup(dnn);
|
pdr->dnn = ogs_strdup(dnn);
|
||||||
ogs_assert(pdr->dnn);
|
ogs_assert(pdr->dnn);
|
||||||
|
@ -669,7 +669,7 @@ ogs_pfcp_pdr_t *ogs_pfcp_handle_update_pdr(ogs_pfcp_sess_t *sess,
|
||||||
|
|
||||||
ogs_assert(0 < ogs_fqdn_parse(dnn,
|
ogs_assert(0 < ogs_fqdn_parse(dnn,
|
||||||
message->pdi.network_instance.data,
|
message->pdi.network_instance.data,
|
||||||
ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN+1)));
|
ogs_min(message->pdi.network_instance.len, OGS_MAX_DNN_LEN)));
|
||||||
|
|
||||||
if (pdr->dnn)
|
if (pdr->dnn)
|
||||||
ogs_free(pdr->dnn);
|
ogs_free(pdr->dnn);
|
||||||
|
|
|
@ -175,7 +175,7 @@ int16_t ogs_pfcp_parse_user_plane_ip_resource_info(
|
||||||
|
|
||||||
ogs_assert(0 < ogs_fqdn_parse(
|
ogs_assert(0 < ogs_fqdn_parse(
|
||||||
info->network_instance, (char *)octet->data + size,
|
info->network_instance, (char *)octet->data + size,
|
||||||
ogs_min(len, OGS_MAX_APN_LEN)+1));
|
ogs_min(len, OGS_MAX_APN_LEN)));
|
||||||
size += len;
|
size += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,9 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile(
|
||||||
ogs_expect_or_return_val(NFProfile->fqdn, NULL);
|
ogs_expect_or_return_val(NFProfile->fqdn, NULL);
|
||||||
NFProfile->fqdn[fqdn_len] = 0;
|
NFProfile->fqdn[fqdn_len] = 0;
|
||||||
|
|
||||||
ogs_trace("FQDN[%s]", nf_instance->fqdn);
|
ogs_debug("NFInstance-FQDN[%s]", nf_instance->fqdn);
|
||||||
|
ogs_log_hexdump(OGS_LOG_DEBUG,
|
||||||
|
(unsigned char *)NFProfile->fqdn, fqdn_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
NFProfile->is_priority = true;
|
NFProfile->is_priority = true;
|
||||||
|
@ -188,6 +190,10 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile(
|
||||||
NFService->fqdn = ogs_memdup(fqdn, fqdn_len+1);
|
NFService->fqdn = ogs_memdup(fqdn, fqdn_len+1);
|
||||||
ogs_expect_or_return_val(NFService->fqdn, NULL);
|
ogs_expect_or_return_val(NFService->fqdn, NULL);
|
||||||
NFService->fqdn[fqdn_len] = 0;
|
NFService->fqdn[fqdn_len] = 0;
|
||||||
|
|
||||||
|
ogs_debug("NFService-FQDN[%s]", nf_service->fqdn);
|
||||||
|
ogs_log_hexdump(OGS_LOG_DEBUG,
|
||||||
|
(unsigned char *)NFService->fqdn, fqdn_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
IpEndPointList = OpenAPI_list_create();
|
IpEndPointList = OpenAPI_list_create();
|
||||||
|
|
|
@ -247,10 +247,16 @@ bool ogs_sbi_nnrf_handle_nf_profile(ogs_sbi_nf_instance_t *nf_instance,
|
||||||
if (NFProfile->is_heart_beat_timer == true)
|
if (NFProfile->is_heart_beat_timer == true)
|
||||||
nf_instance->time.heartbeat_interval = NFProfile->heart_beat_timer;
|
nf_instance->time.heartbeat_interval = NFProfile->heart_beat_timer;
|
||||||
|
|
||||||
if (NFProfile->fqdn)
|
if (NFProfile->fqdn) {
|
||||||
ogs_assert(0 < ogs_fqdn_parse(
|
if (ogs_fqdn_parse(
|
||||||
nf_instance->fqdn, NFProfile->fqdn,
|
nf_instance->fqdn, NFProfile->fqdn,
|
||||||
ogs_min(strlen(NFProfile->fqdn), OGS_MAX_FQDN_LEN+1)));
|
ogs_min(strlen(NFProfile->fqdn), OGS_MAX_FQDN_LEN)) > 0) {
|
||||||
|
/* Nothing : succeeded to parse FQDN */
|
||||||
|
} else {
|
||||||
|
ogs_error("ogs_fqdn_parse() failed[%s]", NFProfile->fqdn);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (NFProfile->is_priority == true)
|
if (NFProfile->is_priority == true)
|
||||||
nf_instance->priority = NFProfile->priority;
|
nf_instance->priority = NFProfile->priority;
|
||||||
|
@ -328,10 +334,16 @@ bool ogs_sbi_nnrf_handle_nf_profile(ogs_sbi_nf_instance_t *nf_instance,
|
||||||
NFServiceVersion->expiry);
|
NFServiceVersion->expiry);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NFService->fqdn)
|
if (NFService->fqdn) {
|
||||||
ogs_assert(0 < ogs_fqdn_parse(
|
if (ogs_fqdn_parse(
|
||||||
nf_service->fqdn, NFService->fqdn,
|
nf_service->fqdn, NFService->fqdn,
|
||||||
ogs_min(strlen(NFService->fqdn), OGS_MAX_FQDN_LEN+1)));
|
ogs_min(strlen(NFService->fqdn), OGS_MAX_FQDN_LEN)) > 0) {
|
||||||
|
/* Nothing : succeeded to parse FQDN */
|
||||||
|
} else {
|
||||||
|
ogs_error("ogs_fqdn_parse() failed[%s]", NFService->fqdn);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
OpenAPI_list_for_each(IpEndPointList, node2) {
|
OpenAPI_list_for_each(IpEndPointList, node2) {
|
||||||
OpenAPI_ip_end_point_t *IpEndPoint = node2->data;
|
OpenAPI_ip_end_point_t *IpEndPoint = node2->data;
|
||||||
|
|
|
@ -104,7 +104,7 @@ bool bsf_nbsf_management_handle_pcf_binding(
|
||||||
ogs_assert(0 < ogs_fqdn_parse(
|
ogs_assert(0 < ogs_fqdn_parse(
|
||||||
fqdn, RecvPcfBinding->pcf_fqdn,
|
fqdn, RecvPcfBinding->pcf_fqdn,
|
||||||
ogs_min(strlen(RecvPcfBinding->pcf_fqdn),
|
ogs_min(strlen(RecvPcfBinding->pcf_fqdn),
|
||||||
OGS_MAX_FQDN_LEN+1)));
|
OGS_MAX_FQDN_LEN)));
|
||||||
|
|
||||||
if (sess->pcf_fqdn)
|
if (sess->pcf_fqdn)
|
||||||
ogs_free(sess->pcf_fqdn);
|
ogs_free(sess->pcf_fqdn);
|
||||||
|
|
|
@ -288,7 +288,7 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
||||||
case SGSAP_IE_VLR_NAME_TYPE:
|
case SGSAP_IE_VLR_NAME_TYPE:
|
||||||
ogs_assert(0 < ogs_fqdn_parse(
|
ogs_assert(0 < ogs_fqdn_parse(
|
||||||
vlr_name, iter->value,
|
vlr_name, iter->value,
|
||||||
ogs_min(iter->length, SGSAP_IE_VLR_NAME_LEN+1)));
|
ogs_min(iter->length, SGSAP_IE_VLR_NAME_LEN)));
|
||||||
break;
|
break;
|
||||||
case SGSAP_IE_LAI_TYPE:
|
case SGSAP_IE_LAI_TYPE:
|
||||||
lai = iter->value;
|
lai = iter->value;
|
||||||
|
|
|
@ -191,7 +191,7 @@ void sgwc_s11_handle_create_session_request(
|
||||||
/* Add Session */
|
/* Add Session */
|
||||||
ogs_assert(0 < ogs_fqdn_parse(apn,
|
ogs_assert(0 < ogs_fqdn_parse(apn,
|
||||||
req->access_point_name.data,
|
req->access_point_name.data,
|
||||||
ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN+1)));
|
ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN)));
|
||||||
sess = sgwc_sess_find_by_ebi(sgwc_ue,
|
sess = sgwc_sess_find_by_ebi(sgwc_ue,
|
||||||
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
|
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
|
||||||
if (sess) {
|
if (sess) {
|
||||||
|
|
|
@ -1037,7 +1037,7 @@ smf_sess_t *smf_sess_add_by_gtp_message(ogs_gtp_message_t *message)
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_assert(0 < ogs_fqdn_parse(apn, req->access_point_name.data,
|
ogs_assert(0 < ogs_fqdn_parse(apn, req->access_point_name.data,
|
||||||
ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN+1)));
|
ogs_min(req->access_point_name.len, OGS_MAX_APN_LEN)));
|
||||||
|
|
||||||
ogs_trace("smf_sess_add_by_message() [APN:%s]", apn);
|
ogs_trace("smf_sess_add_by_message() [APN:%s]", apn);
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ void af_nbsf_management_handle_pcf_binding(
|
||||||
|
|
||||||
if (PcfBinding->pcf_fqdn) {
|
if (PcfBinding->pcf_fqdn) {
|
||||||
ogs_assert(0 < ogs_fqdn_parse(fqdn, PcfBinding->pcf_fqdn,
|
ogs_assert(0 < ogs_fqdn_parse(fqdn, PcfBinding->pcf_fqdn,
|
||||||
ogs_min(strlen(PcfBinding->pcf_fqdn), OGS_MAX_FQDN_LEN+1)));
|
ogs_min(strlen(PcfBinding->pcf_fqdn), OGS_MAX_FQDN_LEN)));
|
||||||
if (sess->pcf.fqdn)
|
if (sess->pcf.fqdn)
|
||||||
ogs_free(sess->pcf.fqdn);
|
ogs_free(sess->pcf.fqdn);
|
||||||
sess->pcf.fqdn = ogs_strdup(fqdn);
|
sess->pcf.fqdn = ogs_strdup(fqdn);
|
||||||
|
|
Loading…
Reference in New Issue