From c26a12e6b74583e4a7db50d9f5b96ff4ed09e9c1 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 14 Apr 2025 07:59:21 +0200 Subject: [PATCH] Correctly free ASN.1 memory for unused dedicated BWPs prepare_scd() sets up memory for possible dedicated BWPs to be set up. If they are not used, they are freed in fix_scd(). [1] There are two problems: 1. in prepare_scd(), multiple structures are allocated once (for multiple elements), but inserted once. When trying to free those, the logic of ASN.1 is to free list elements individually, but then we try to call free() on each element of the list that has been allocated in one go. Fix this by doing multiple allocations to be in line with ASN.1 logic. 2. in fix_scd(), free recursively all data structures, not only the sequence element itself. [1] this is horrible. We should only allocate memory if we actually need it, but let's fix the more urgent problem of memory leaks first. Fixing the logic problem would be more involved. --- openair2/GNB_APP/gnb_config.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index a43812ebdb..3eb43e21a0 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -636,14 +636,14 @@ void prepare_scd(NR_ServingCellConfig_t *scd) { calloc_or_fail(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup)); NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup; NR_PTRS_DownlinkCfg->frequencyDensity = calloc_or_fail(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity)); - long *dl_rbs = calloc_or_fail(2, sizeof(*dl_rbs)); for (int i=0;i<2;i++) { - asn1cSeqAdd(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]); + long *a = calloc_or_fail(1, sizeof(*a)); + asn1cSeqAdd(&NR_PTRS_DownlinkCfg->frequencyDensity->list, a); } NR_PTRS_DownlinkCfg->timeDensity = calloc_or_fail(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity)); - long *dl_mcs = calloc_or_fail(3, sizeof(*dl_mcs)); for (int i=0;i<3;i++) { - asn1cSeqAdd(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]); + long *dl_mcs = calloc_or_fail(1, sizeof(*dl_mcs)); + asn1cSeqAdd(&NR_PTRS_DownlinkCfg->timeDensity->list, dl_mcs); } NR_PTRS_DownlinkCfg->epre_Ratio = calloc_or_fail(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio)); NR_PTRS_DownlinkCfg->resourceElementOffset = calloc_or_fail(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset)); @@ -668,15 +668,15 @@ void prepare_scd(NR_ServingCellConfig_t *scd) { NR_PTRS_UplinkConfig->transformPrecoderDisabled = calloc_or_fail(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled)); NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = calloc_or_fail(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity)); - long *n_rbs = calloc_or_fail(2, sizeof(*n_rbs)); for (int i=0;i<2;i++) { - asn1cSeqAdd(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]); + long *n_rbs = calloc_or_fail(1, sizeof(*n_rbs)); + asn1cSeqAdd(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, n_rbs); } NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = calloc_or_fail(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity)); - long *ptrs_mcs = calloc_or_fail(3, sizeof(*ptrs_mcs)); for (int i = 0; i < 3; i++) { - asn1cSeqAdd(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]); + long *ptrs_mcs = calloc_or_fail(1, sizeof(*ptrs_mcs)); + asn1cSeqAdd(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, ptrs_mcs); } NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = calloc_or_fail(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset)); @@ -703,6 +703,7 @@ void fix_scd(NR_ServingCellConfig_t *scd) { int b = 0; while (bdownlinkBWP_ToAddModList->list.count) { if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) { + ASN_STRUCT_FREE(asn_DEF_NR_BWP_Downlink, scd->downlinkBWP_ToAddModList->list.array[b]); asn_sequence_del(&scd->downlinkBWP_ToAddModList->list,b,1); } else { b++; @@ -712,6 +713,7 @@ void fix_scd(NR_ServingCellConfig_t *scd) { b = 0; while (buplinkConfig->uplinkBWP_ToAddModList->list.count) { if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) { + ASN_STRUCT_FREE(asn_DEF_NR_BWP_Uplink, scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]); asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,b,1); } else { b++;