pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/41706?usp=email )
Change subject: gsmtap_util: Avoid sink_fd leak gsmtap_source_add_sinki() called multiple times ......................................................................
gsmtap_util: Avoid sink_fd leak gsmtap_source_add_sinki() called multiple times
gti->sink_fd could leak if gsmtap_source_add_sink() was called multiple times.
Also if gsmtap_source_add_sink_fd() failed, rc != -1 was returned and hence a close() on a wrong fd would be attempted.
This commit fixes both issues, making the whole sink_fd field much more robust.
Change-Id: I7af5a6c7d64954ee2cc013711702b846dfaa02b1 --- M src/core/gsmtap_util.c 1 file changed, 10 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/06/41706/1
diff --git a/src/core/gsmtap_util.c b/src/core/gsmtap_util.c index f1a2abf..065dc51 100644 --- a/src/core/gsmtap_util.c +++ b/src/core/gsmtap_util.c @@ -436,7 +436,15 @@ */ int gsmtap_source_add_sink(struct gsmtap_inst *gti) { - return gti->sink_fd = gsmtap_source_add_sink_fd(gsmtap_inst_fd2(gti)); + int rc; + + if (gti->sink_fd >= 0) + return -EALREADY; + + rc = gsmtap_source_add_sink_fd(gsmtap_inst_fd2(gti)); + if (rc >= 0) + gti->sink_fd = rc; + return rc; }
/* Registered in Osmo IO as a no-op to set the write callback. */ @@ -520,7 +528,7 @@ close(gti->source_fd);
- if (gti->sink_fd != -1) { + if (gti->sink_fd >= 0) { close(gti->sink_fd); gti->sink_fd = -1; }