pespin has uploaded this change for review.

View Change

osmo_io: segmented_read: Avoid triggering read events if user unregisters

The user code doesn't expect to receive any more read cb events after
unregistering the FD. Avoid keep calling the read cb if several entire
messages were received at once in a single tcp chunk.

Related: SYS#7063
Change-Id: Id2199b9aa805cc7e7793c1a8aecd10b61f2b4c90
---
M src/core/osmo_io.c
1 file changed, 9 insertions(+), 1 deletion(-)

git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/72/39072/1
diff --git a/src/core/osmo_io.c b/src/core/osmo_io.c
index c61c8e9..d1767d2 100644
--- a/src/core/osmo_io.c
+++ b/src/core/osmo_io.c
@@ -340,8 +340,16 @@
do {
pending = NULL;
res = iofd_handle_segmentation(iofd, msg, &pending);
- if (res != IOFD_SEG_ACT_DEFER || rc < 0)
+ if (res != IOFD_SEG_ACT_DEFER || rc < 0) {
iofd->io_ops.read_cb(iofd, rc, msg);
+ /* The user could unregister/close the iofd during read_cb() above.
+ * Once that's done, it doesn't expect to receive any more events,
+ * so discard it: */
+ if (!IOFD_FLAG_ISSET(iofd, IOFD_FLAG_FD_REGISTERED)) {
+ msgb_free(pending);
+ return;
+ }
+ }
if (res == IOFD_SEG_ACT_HANDLE_MORE)
msg = pending;
} while (res == IOFD_SEG_ACT_HANDLE_MORE);

To view, visit change 39072. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Id2199b9aa805cc7e7793c1a8aecd10b61f2b4c90
Gerrit-Change-Number: 39072
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>