This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.
Holger Hans Peter Freyther holger at freyther.deOn Thu, Aug 01, 2013 at 05:06:37PM +0200, Holger Hans Peter Freyther wrote: > On Thu, Aug 01, 2013 at 08:48:42PM +0800, Harald Welte wrote: > > > > I _think_ the following (untested) patch should do the trick. > > nope, the whole ownership model is wrong. BSSGP will not delete > in most casess, NS will delete them. > > > a.) we use the trick i mentioned (e.g. talloc_steal) > b.) we review the entire stack and fix and enforce the ownershop > E.g. I started to do b.) in OpenBSC and libosmocore.. but it requires quite some work.. to descend all the way down to sendmsg/write and then all the way up to all callers... in my changes I am still on BSSGP and have not decended down... to NS.. specially in the FlowControl code it is not too clear what will out_cb handlers. :) openbsc: diff --git a/openbsc/src/gprs/gprs_llc.c b/openbsc/src/gprs/gprs_llc.c index e2d3160..6f209d4 100644 --- a/openbsc/src/gprs/gprs_llc.c +++ b/openbsc/src/gprs/gprs_llc.c @@ -422,6 +422,7 @@ int gprs_llc_tx_ui(struct msgb *msg, uint8_t sapi, int command, if (msg->len > lle->params.n201_u) { LOGP(DLLC, LOGL_ERROR, "Cannot Tx %u bytes (N201-U=%u)\n", msg->len, lle->params.n201_u); + msgb_free(msg); return -EFBIG; } @@ -479,6 +480,7 @@ int gprs_llc_tx_ui(struct msgb *msg, uint8_t sapi, int command, kc, iv, GPRS_CIPH_SGSN2MS); if (rc < 0) { LOGP(DLLC, LOGL_ERROR, "Error crypting UI frame: %d\n", rc); + msgb_free(msg); return rc; } diff --git a/openbsc/src/gprs/gprs_sndcp.c b/openbsc/src/gprs/gprs_sndcp.c index 853f8db..ffbfab5 100644 --- a/openbsc/src/gprs/gprs_sndcp.c +++ b/openbsc/src/gprs/gprs_sndcp.c @@ -420,7 +420,6 @@ static int sndcp_send_ud_frag(struct sndcp_frag_state *fs) rc = gprs_llc_tx_ui(fmsg, lle->sapi, 0, fs->mmcontext); if (rc < 0) { /* abort in case of error, do not advance frag_nr / next_byte */ - msgb_free(fmsg); return rc; } libosmocore: diff --git a/src/gb/gprs_bssgp.c b/src/gb/gprs_bssgp.c index 5ef1887..325e35c 100644 --- a/src/gb/gprs_bssgp.c +++ b/src/gb/gprs_bssgp.c @@ -609,17 +609,21 @@ static int fc_queue_timer_cfg(struct bssgp_flow_control *fc) } /* Enqueue a PDU in the flow control queue for delayed transmission */ -static int fc_enqueue(struct bssgp_flow_control *fc, struct msgb *msg, +static int fc_enqueue(struct bssgp_flow_control *fc, struct msgb OWNS(*msg), uint32_t llc_pdu_len, void *priv) { struct bssgp_fc_queue_element *fcqe; - if (fc->queue_depth >= fc->max_queue_depth) + if (fc->queue_depth >= fc->max_queue_depth) { + msgb_free(msg); return -ENOSPC; + } fcqe = talloc_zero(fc, struct bssgp_fc_queue_element); - if (!fcqe) + if (!fcqe) { + msgb_free(msg); return -ENOMEM; + } fcqe->msg = msg; fcqe->llc_pdu_len = llc_pdu_len; fcqe->priv = priv; @@ -687,7 +691,7 @@ static int _bssgp_tx_dl_ud(struct bssgp_flow_control *fc, struct msgb *msg, /* input function of the flow control implementation, called first * for the MM flow control, and then as the MM flow control output * callback in order to perform BVC flow control */ -int bssgp_fc_in(struct bssgp_flow_control *fc, struct msgb *msg, +int bssgp_fc_in(struct bssgp_flow_control *fc, struct msgb OWNS(*msg), uint32_t llc_pdu_len, void *priv) { struct timeval time_now; @@ -696,6 +700,7 @@ int bssgp_fc_in(struct bssgp_flow_control *fc, struct msgb *msg, LOGP(DBSSGP, LOGL_NOTICE, "Single PDU (size=%u) is larger " "than maximum bucket size (%u)!\n", llc_pdu_len, fc->bucket_size_max); + msgb_free(msg) return -EIO; } @@ -1018,7 +1023,7 @@ int bssgp_rcvmsg(struct msgb *msg) return rc; } -int bssgp_tx_dl_ud(struct msgb *msg, uint16_t pdu_lifetime, +int bssgp_tx_dl_ud(struct msgb OWNS(*msg), uint16_t pdu_lifetime, struct bssgp_dl_ud_par *dup) { struct bssgp_bvc_ctx *bctx; @@ -1035,6 +1040,7 @@ int bssgp_tx_dl_ud(struct msgb *msg, uint16_t pdu_lifetime, if (bvci <= BVCI_PTM ) { LOGP(DBSSGP, LOGL_ERROR, "Cannot send DL-UD to BVCI %u\n", bvci); + msgb_free(msg); return -EINVAL; } @@ -1042,6 +1048,7 @@ int bssgp_tx_dl_ud(struct msgb *msg, uint16_t pdu_lifetime, if (!bctx) { LOGP(DBSSGP, LOGL_ERROR, "Cannot send DL-UD to unknown BVCI %u\n", bvci); + msgb_free(msg) return -ENODEV; }