[MME] fix the crash with unknown S-NSSAI (#1287)

This commit is contained in:
Sukchan Lee 2021-12-17 21:42:26 +09:00
parent 54b919f65f
commit d87d7c12c2
4 changed files with 15 additions and 24 deletions

View file

@ -43,7 +43,6 @@ int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn,
ogs_session_data_t zero_data; ogs_session_data_t zero_data;
ogs_assert(supi); ogs_assert(supi);
ogs_assert(s_nssai);
ogs_assert(dnn); ogs_assert(dnn);
ogs_assert(session_data); ogs_assert(session_data);
@ -122,9 +121,10 @@ int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn,
continue; continue;
} }
if (s_nssai->sst != sst) continue; if (s_nssai && s_nssai->sst != sst) continue;
if (s_nssai->sd.v != OGS_S_NSSAI_NO_SD_VALUE && if (s_nssai &&
s_nssai->sd.v != OGS_S_NSSAI_NO_SD_VALUE &&
sd.v != OGS_S_NSSAI_NO_SD_VALUE) { sd.v != OGS_S_NSSAI_NO_SD_VALUE) {
if (s_nssai->sd.v != sd.v) continue; if (s_nssai->sd.v != sd.v) continue;
} }
@ -150,7 +150,10 @@ int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn,
done: done:
if (found == false) { if (found == false) {
ogs_error("Cannot find SUPI[%s] S_NSSAI[SST:%d SD:0x%x] DNN[%s] in DB", ogs_error("Cannot find SUPI[%s] S_NSSAI[SST:%d SD:0x%x] DNN[%s] in DB",
supi_id, s_nssai->sst, s_nssai->sd.v, dnn); supi_id,
s_nssai ? s_nssai->sst : 0,
s_nssai ? s_nssai->sd.v : 0,
dnn);
rv = OGS_ERROR; rv = OGS_ERROR;
goto out; goto out;

View file

@ -277,7 +277,6 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp,
union avp_value val; union avp_value val;
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
ogs_s_nssai_t s_nssai;
int rv; int rv;
uint32_t result_code = 0; uint32_t result_code = 0;
@ -463,13 +462,10 @@ static int hss_ogs_diam_s6a_ulr_cb( struct msg **msg, struct avp *avp,
ret = fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avp_rau_tau_timer); ret = fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avp_rau_tau_timer);
ogs_assert(ret == 0); ogs_assert(ret == 0);
/* For EPC, we'll use SST:1 */ /* For EPC, we'll use first Slice in Subscription */
s_nssai.sst = 1; if (subscription_data.num_of_slice)
s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; slice_data = &subscription_data.slice[0];
slice_data = ogs_slice_find_by_s_nssai(
subscription_data.slice, subscription_data.num_of_slice,
&s_nssai);
if (!slice_data) { if (!slice_data) {
ogs_error("[%s] Cannot find S-NSSAI", imsi_bcd); ogs_error("[%s] Cannot find S-NSSAI", imsi_bcd);
result_code = OGS_DIAM_S6A_ERROR_UNKNOWN_EPS_SUBSCRIPTION; result_code = OGS_DIAM_S6A_ERROR_UNKNOWN_EPS_SUBSCRIPTION;

View file

@ -388,7 +388,6 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp,
union avp_value val; union avp_value val;
char *user_name = NULL; char *user_name = NULL;
ogs_s_nssai_t s_nssai;
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
@ -557,13 +556,10 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp,
ret = fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avp_ambr); ret = fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avp_ambr);
ogs_assert(ret == 0); ogs_assert(ret == 0);
/* For EPC, we'll use SST:1 */ /* For EPC, we'll use first Slice in Subscription */
s_nssai.sst = 1; if (subscription_data.num_of_slice)
s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE; slice_data = &subscription_data.slice[0];
slice_data = ogs_slice_find_by_s_nssai(
subscription_data.slice, subscription_data.num_of_slice,
&s_nssai);
if (!slice_data) { if (!slice_data) {
ogs_error("[%s] Cannot find S-NSSAI", imsi_bcd); ogs_error("[%s] Cannot find S-NSSAI", imsi_bcd);
result_code = OGS_DIAM_S6A_ERROR_UNKNOWN_EPS_SUBSCRIPTION; result_code = OGS_DIAM_S6A_ERROR_UNKNOWN_EPS_SUBSCRIPTION;

View file

@ -271,7 +271,6 @@ int pcrf_db_qos_data(
{ {
int rv, i; int rv, i;
char *supi = NULL; char *supi = NULL;
ogs_s_nssai_t s_nssai;
ogs_assert(imsi_bcd); ogs_assert(imsi_bcd);
ogs_assert(apn); ogs_assert(apn);
@ -281,11 +280,8 @@ int pcrf_db_qos_data(
supi = ogs_msprintf("%s-%s", OGS_ID_SUPI_TYPE_IMSI, imsi_bcd); supi = ogs_msprintf("%s-%s", OGS_ID_SUPI_TYPE_IMSI, imsi_bcd);
ogs_assert(supi); ogs_assert(supi);
/* For EPC, we'll use SST:1 */ /* For EPC, we'll use [S_NSSAI = NULL] */
s_nssai.sst = 1; rv = ogs_dbi_session_data(supi, NULL, apn, session_data);
s_nssai.sd.v = OGS_S_NSSAI_NO_SD_VALUE;
rv = ogs_dbi_session_data(supi, &s_nssai, apn, session_data);
/* For EPC, we need to inialize Flow-Status in Pcc-Rule */ /* For EPC, we need to inialize Flow-Status in Pcc-Rule */
for (i = 0; i < session_data->num_of_pcc_rule; i++) { for (i = 0; i < session_data->num_of_pcc_rule; i++) {