aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-07-14 21:11:56 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2020-07-15 15:39:33 +0200
commit8737ad4f75331e68b94b15fd3da270e7335ba594 (patch)
treee962aa075605e82c9f2d97b64288a015b3957d80
parentb8ea0ff521a3e01c22a9dd1948b9a853521f575e (diff)
ipacces: Fix e1inp_line reference put in ipaccess_close
Drop the function e1inp_close_socket since it's only used by the caller at hand, and it's only exported through "internal.h", so no app is using it. Remove it because there's only a caller, and furthermore because keeping it (and putting bfd->data==line) would introduce a layer violation because the bfd->data==line is only used for ipaccess so far. Triggering path: handle_ts1_read ret=0 "Sign link vanished" ipaccess_drop line->ops->sign_link_down (osmo-bsc) ipaccess_drop_oml e1inp_sign_link_destroy link->ts->line->driver->close ipaccess_close Related: OS#4624 Change-Id: If23cc722106a9f70c998e591369a4acafa52c519
-rw-r--r--include/internal.h8
-rw-r--r--src/e1_input.c16
-rw-r--r--src/input/ipaccess.c14
3 files changed, 15 insertions, 23 deletions
diff --git a/include/internal.h b/include/internal.h
index c931d4f..8a5aa2e 100644
--- a/include/internal.h
+++ b/include/internal.h
@@ -20,13 +20,7 @@ const char *e1inp_ipa_get_bind_addr(void);
struct msgb;
struct msgb *ipa_msg_alloc(int headroom);
-/*
- * helper for internal drivers, not public
- */
-void e1inp_close_socket(struct e1inp_ts *ts,
- struct e1inp_sign_link *sign_link,
- struct osmo_fd *bfd);
-
+int e1inp_int_snd_event(struct e1inp_ts *ts, struct e1inp_sign_link *link, int evt);
#endif
diff --git a/src/e1_input.c b/src/e1_input.c
index fc0370d..df61c7b 100644
--- a/src/e1_input.c
+++ b/src/e1_input.c
@@ -816,8 +816,7 @@ struct msgb *e1inp_tx_ts(struct e1inp_ts *e1i_ts,
return msg;
}
-static int e1inp_int_snd_event(struct e1inp_ts *ts,
- struct e1inp_sign_link *link, int evt)
+int e1inp_int_snd_event(struct e1inp_ts *ts, struct e1inp_sign_link *link, int evt)
{
struct input_signal_data isd;
isd.line = ts->line;
@@ -844,19 +843,6 @@ int e1inp_event(struct e1inp_ts *ts, int evt, uint8_t tei, uint8_t sapi)
return e1inp_int_snd_event(ts, link, evt);
}
-void e1inp_close_socket(struct e1inp_ts *ts,
- struct e1inp_sign_link *sign_link,
- struct osmo_fd *bfd)
-{
- e1inp_int_snd_event(ts, sign_link, S_L_INP_TEI_DN);
- /* the first e1inp_sign_link_destroy call closes the socket. */
- if (bfd->fd != -1) {
- osmo_fd_unregister(bfd);
- close(bfd->fd);
- bfd->fd = -1;
- }
-}
-
/* register a driver with the E1 core */
int e1inp_driver_register(struct e1inp_driver *drv)
{
diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c
index 08b34a4..4d55e71 100644
--- a/src/input/ipaccess.c
+++ b/src/input/ipaccess.c
@@ -431,7 +431,19 @@ static void ipaccess_close(struct e1inp_sign_link *sign_link)
}
- return e1inp_close_socket(e1i_ts, sign_link, bfd);
+ e1inp_int_snd_event(e1i_ts, sign_link, S_L_INP_TEI_DN);
+ /* the first e1inp_sign_link_destroy call closes the socket. */
+ if (bfd->fd != -1) {
+ osmo_fd_unregister(bfd);
+ close(bfd->fd);
+ bfd->fd = -1;
+ /* If The bfd holds a reference to e1inp_line in ->data (BSC
+ * accepted() sockets), then release it */
+ if (bfd->data == line) {
+ bfd->data = NULL;
+ e1inp_line_put2(line, "ipa_bfd");
+ }
+ }
}
static void timeout_ts1_write(void *data)