mirror of https://gerrit.osmocom.org/libosmocore
gsmtap: Add gsmtap_sendmsg_free() as alternative to gsmtap_sendmsg()
gsmtap_sendmsg() places the burden of freeing the msgb in case of erroneous return codes on the caller. A review of existing users shows that this is overly optimistic and many calls get it wrong, opening up memory leaks. Let's add a new function gsmtap_sendmsg_free() which behaves like gsmtap_sendmsg() but always takes ownership: Either it is sent + freed, or it is just freed. Change-Id: I106b09f2a49bf24ce0e8d11fd4d4ee93e9cafdf5 Related: OS#5329
This commit is contained in:
parent
e352715eb1
commit
9e34f08d0b
|
@ -48,6 +48,7 @@ struct gsmtap_inst *gsmtap_source_init(const char *host, uint16_t port,
|
|||
int gsmtap_source_add_sink(struct gsmtap_inst *gti);
|
||||
|
||||
int gsmtap_sendmsg(struct gsmtap_inst *gti, struct msgb *msg);
|
||||
int gsmtap_sendmsg_free(struct gsmtap_inst *gti, struct msgb *msg);
|
||||
|
||||
int gsmtap_send_ex(struct gsmtap_inst *gti, uint8_t type, uint16_t arfcn, uint8_t ts,
|
||||
uint8_t chan_type, uint8_t ss, uint32_t fn,
|
||||
|
|
|
@ -323,6 +323,20 @@ int gsmtap_sendmsg(struct gsmtap_inst *gti, struct msgb *msg)
|
|||
}
|
||||
}
|
||||
|
||||
/*! Send a \ref msgb through a GSMTAP source; free the message even if tx queue full.
|
||||
* \param[in] gti GSMTAP instance
|
||||
* \param[in] msg message buffer; always freed, caller must not reference it later.
|
||||
* \return 0 in case of success; negative in case of error
|
||||
*/
|
||||
int gsmtap_sendmsg_free(struct gsmtap_inst *gti, struct msgb *msg)
|
||||
{
|
||||
int rc;
|
||||
rc = gsmtap_sendmsg(gti, msg);
|
||||
if (rc < 0)
|
||||
msgb_free(msg);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*! send an arbitrary type through GSMTAP.
|
||||
* See \ref gsmtap_makemsg_ex for arguments
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue