<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-abis/+/19256">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, but someone else must approve
  Hoernchen: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">e1_input: Use osmo_use_count in e1inp_line<br><br>osmo_use_count is available since libosmocore 1.1.0 release, so bump<br>required libosmocore version in autotools and packages.<br><br>struct e1inp_line field refcnt is kept in order to keep ABI<br>compatibility accessing struct fields. The new use_count is added at the<br>end. Size of struct changing is fine since it is allocated through<br>an API and a pointer should be used by clients.<br><br>e1inp_line_clone API is changed but it's not used by anyone outside<br>libosmo-abis, so it's fine.<br><br>Related: OS#4624<br>Change-Id: I0658b2e9c452598025cc0f1d0b060076171767cc<br>---<br>M TODO-RELEASE<br>M configure.ac<br>M contrib/libosmo-abis.spec.in<br>M debian/control<br>M include/osmocom/abis/e1_input.h<br>M src/e1_input.c<br>M src/input/ipaccess.c<br>7 files changed, 85 insertions(+), 54 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/TODO-RELEASE b/TODO-RELEASE</span><br><span>index 85b16a7..aa278ec 100644</span><br><span>--- a/TODO-RELEASE</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -10,3 +10,4 @@</span><br><span> libosmo-abis       API change      major: add parameter to struct e1inp_line</span><br><span> libosmo-trau       API change      add new function osmo_rtp_socket_set_dscp()</span><br><span> libosmo-abis     API change      major: add parameter to struct lapd_instance</span><br><span style="color: hsl(120, 100%, 40%);">+libosmo-abis      Field added     struct e1inp_line "use_count". REMINDER: Upon LIBVERSION c bump, take the chance to drop struct e1inp_line "refcnt" field.</span><br><span>diff --git a/configure.ac b/configure.ac</span><br><span>index f095cf5..04ffca6 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -64,9 +64,9 @@</span><br><span> dnl Generate the output</span><br><span> AM_CONFIG_HEADER(config.h)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.0.0)</span><br><span style="color: hsl(0, 100%, 40%);">-PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.0.0)</span><br><span style="color: hsl(0, 100%, 40%);">-PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.0.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.1.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.1.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.1.0)</span><br><span> PKG_CHECK_MODULES(ORTP, ortp >= 0.22.0)</span><br><span> </span><br><span> AC_ARG_ENABLE([dahdi],</span><br><span>diff --git a/contrib/libosmo-abis.spec.in b/contrib/libosmo-abis.spec.in</span><br><span>index 3ad36b1..da0c2d8 100644</span><br><span>--- a/contrib/libosmo-abis.spec.in</span><br><span>+++ b/contrib/libosmo-abis.spec.in</span><br><span>@@ -27,9 +27,9 @@</span><br><span> BuildRequires:  libtool >= 2</span><br><span> BuildRequires:  pkgconfig >= 0.20</span><br><span> BuildRequires:  xz</span><br><span style="color: hsl(0, 100%, 40%);">-BuildRequires:  pkgconfig(libosmocore) >= 1.0.0</span><br><span style="color: hsl(0, 100%, 40%);">-BuildRequires:  pkgconfig(libosmogsm) >= 1.0.0</span><br><span style="color: hsl(0, 100%, 40%);">-BuildRequires:  pkgconfig(libosmovty) >= 1.0.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmocore) >= 1.1.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmogsm) >= 1.1.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmovty) >= 1.1.0</span><br><span> BuildRequires:  pkgconfig(ortp) >= 0.22</span><br><span> BuildRequires:  pkgconfig(talloc)</span><br><span> </span><br><span>diff --git a/debian/control b/debian/control</span><br><span>index b9e2078..7039bfe 100644</span><br><span>--- a/debian/control</span><br><span>+++ b/debian/control</span><br><span>@@ -11,7 +11,7 @@</span><br><span>                dh-autoreconf,</span><br><span>                libdpkg-perl,</span><br><span>                git,</span><br><span style="color: hsl(0, 100%, 40%);">-               libosmocore-dev (>= 1.0.0),</span><br><span style="color: hsl(120, 100%, 40%);">+               libosmocore-dev (>= 1.1.0),</span><br><span>                pkg-config,</span><br><span>                libortp-dev</span><br><span> Standards-Version: 3.9.7</span><br><span>diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h</span><br><span>index ee33ae6..44708bb 100644</span><br><span>--- a/include/osmocom/abis/e1_input.h</span><br><span>+++ b/include/osmocom/abis/e1_input.h</span><br><span>@@ -5,6 +5,7 @@</span><br><span> #include <netinet/in.h></span><br><span> </span><br><span> #include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/use_count.h></span><br><span> #include <osmocom/core/timer.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/core/select.h></span><br><span>@@ -191,7 +192,7 @@</span><br><span> </span><br><span> struct e1inp_line {</span><br><span>     struct llist_head list;</span><br><span style="color: hsl(0, 100%, 40%);">- int refcnt;</span><br><span style="color: hsl(120, 100%, 40%);">+   int refcnt; /* unusued, kept for ABI compat, use_count is used instead */</span><br><span> </span><br><span>        unsigned int num;</span><br><span>    const char *name;</span><br><span>@@ -215,6 +216,8 @@</span><br><span> </span><br><span>  struct e1inp_driver *driver;</span><br><span>         void *driver_data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_use_count use_count;</span><br><span> };</span><br><span> #define e1inp_line_ipa_oml_ts(line) (&line->ts[0])</span><br><span> #define e1inp_line_ipa_rsl_ts(line, trx_id) (&line->ts[1 + (trx_id)])</span><br><span>@@ -245,13 +248,17 @@</span><br><span> struct e1inp_line *e1inp_line_create(uint8_t e1_nr, const char *driver_name);</span><br><span> </span><br><span> /* clone one existing E1 input line */</span><br><span style="color: hsl(0, 100%, 40%);">-struct e1inp_line *e1inp_line_clone(void *ctx, struct e1inp_line *line);</span><br><span style="color: hsl(120, 100%, 40%);">+struct e1inp_line *e1inp_line_clone(void *ctx, struct e1inp_line *line, const char *use);</span><br><span> </span><br><span> /* increment refcount use of E1 input line */</span><br><span style="color: hsl(0, 100%, 40%);">-void e1inp_line_get(struct e1inp_line *line);</span><br><span style="color: hsl(120, 100%, 40%);">+void e1inp_line_get(struct e1inp_line *line) OSMO_DEPRECATED("Use e1inp_line_get2() instead");</span><br><span> </span><br><span> /* decrement refcount use of E1 input line, release if unused */</span><br><span style="color: hsl(0, 100%, 40%);">-void e1inp_line_put(struct e1inp_line *line);</span><br><span style="color: hsl(120, 100%, 40%);">+void e1inp_line_put(struct e1inp_line *line) OSMO_DEPRECATED("Use e1inp_line_put2() instead");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Convenience macros for struct foo instances. These are strict about use count errors. */</span><br><span style="color: hsl(120, 100%, 40%);">+#define e1inp_line_get2(line, USE) OSMO_ASSERT( osmo_use_count_get_put(&(line)->use_count, USE, 1) == 0 );</span><br><span style="color: hsl(120, 100%, 40%);">+#define e1inp_line_put2(line, USE) OSMO_ASSERT( osmo_use_count_get_put(&(line)->use_count, USE, -1) == 0 );</span><br><span> </span><br><span> /* bind operations to one E1 input line */</span><br><span> void e1inp_line_bind_ops(struct e1inp_line *line, const struct e1inp_line_ops *ops);</span><br><span>diff --git a/src/e1_input.c b/src/e1_input.c</span><br><span>index 9ea4f17..fc0370d 100644</span><br><span>--- a/src/e1_input.c</span><br><span>+++ b/src/e1_input.c</span><br><span>@@ -26,6 +26,7 @@</span><br><span> </span><br><span> #include <stdio.h></span><br><span> #include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span> #include <stdlib.h></span><br><span> #include <errno.h></span><br><span> #include <string.h></span><br><span>@@ -366,6 +367,48 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int e1inp_line_use_cb(struct osmo_use_count_entry *use_count_entry, int32_t old_use_count,</span><br><span style="color: hsl(120, 100%, 40%);">+                      const char *file, int file_line)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      char buf[512];</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_use_count *uc = use_count_entry->use_count;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct e1inp_line *line = uc->talloc_object;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPSRC(DLINP, LOGL_INFO, file, file_line,</span><br><span style="color: hsl(120, 100%, 40%);">+            "E1L(%u) Line (%p) reference count %s changed %" PRId32 " -> %" PRId32 " [%s]\n",</span><br><span style="color: hsl(120, 100%, 40%);">+            (line)->num, line, use_count_entry->use,</span><br><span style="color: hsl(120, 100%, 40%);">+                old_use_count, use_count_entry->count,</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_use_count_name_buf(buf, sizeof(buf), uc));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!use_count_entry->count)</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_use_count_free(use_count_entry);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (osmo_use_count_total(uc) > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Remove our counter group from libosmocore's global counter</span><br><span style="color: hsl(120, 100%, 40%);">+      * list if we are freeing the last remaining talloc context.</span><br><span style="color: hsl(120, 100%, 40%);">+   * Otherwise we get a use-after-free when libosmocore's timer</span><br><span style="color: hsl(120, 100%, 40%);">+      * ticks again and attempts to update these counters (OS#3011).</span><br><span style="color: hsl(120, 100%, 40%);">+        *</span><br><span style="color: hsl(120, 100%, 40%);">+     * Note that talloc internally counts "secondary" references</span><br><span style="color: hsl(120, 100%, 40%);">+         * _in addition to_ the initial allocation context, so yes,</span><br><span style="color: hsl(120, 100%, 40%);">+    * we must check for *zero* remaining secondary contexts here. */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (talloc_reference_count(line->rate_ctr) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         rate_ctr_group_free(line->rate_ctr);</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* We are not freeing the last talloc context.</span><br><span style="color: hsl(120, 100%, 40%);">+                 * Instead of calling talloc_free(), unlink this 'line' pointer</span><br><span style="color: hsl(120, 100%, 40%);">+                * which serves as one of several talloc contexts for the rate</span><br><span style="color: hsl(120, 100%, 40%);">+                 * counters and driver private state. */</span><br><span style="color: hsl(120, 100%, 40%);">+              talloc_unlink(line, line->rate_ctr);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (line->driver_data)</span><br><span style="color: hsl(120, 100%, 40%);">+                     talloc_unlink(line, line->driver_data);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     talloc_free(line);</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct e1inp_line *e1inp_line_find(uint8_t e1_nr)</span><br><span> {</span><br><span>     struct e1inp_line *e1i_line;</span><br><span>@@ -417,14 +460,18 @@</span><br><span>                 line->ts[i].num = i+1;</span><br><span>            line->ts[i].line = line;</span><br><span>  }</span><br><span style="color: hsl(0, 100%, 40%);">-       line->refcnt++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  line->use_count.talloc_object = line;</span><br><span style="color: hsl(120, 100%, 40%);">+      line->use_count.use_cb = e1inp_line_use_cb;</span><br><span style="color: hsl(120, 100%, 40%);">+        e1inp_line_get2(line, "ctor");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   llist_add_tail(&line->list, &e1inp_line_list);</span><br><span> </span><br><span>        return line;</span><br><span> }</span><br><span> </span><br><span> struct e1inp_line *</span><br><span style="color: hsl(0, 100%, 40%);">-e1inp_line_clone(void *ctx, struct e1inp_line *line)</span><br><span style="color: hsl(120, 100%, 40%);">+e1inp_line_clone(void *ctx, struct e1inp_line *line, const char *use)</span><br><span> {</span><br><span>         struct e1inp_line *clone;</span><br><span> </span><br><span>@@ -453,47 +500,23 @@</span><br><span>        if (line->driver_data)</span><br><span>            clone->driver_data = talloc_reference(clone, line->driver_data);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      clone->refcnt = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ clone->use_count = (struct osmo_use_count) {</span><br><span style="color: hsl(120, 100%, 40%);">+               .talloc_object = clone,</span><br><span style="color: hsl(120, 100%, 40%);">+               .use_cb = e1inp_line_use_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+          .use_counts = {0},</span><br><span style="color: hsl(120, 100%, 40%);">+    };</span><br><span style="color: hsl(120, 100%, 40%);">+    e1inp_line_get2(clone, use); /* Clone is used internally for bfd */</span><br><span>  return clone;</span><br><span> }</span><br><span> </span><br><span> void e1inp_line_get(struct e1inp_line *line)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     int old_refcnt = line->refcnt++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGPIL(line, DLINP, LOGL_DEBUG, "Line '%s' (%p) reference count get: %d -> %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-       line->name, line, old_refcnt, line->refcnt);</span><br><span style="color: hsl(120, 100%, 40%);">+       e1inp_line_get2(line, "unknown");</span><br><span> }</span><br><span> </span><br><span> void e1inp_line_put(struct e1inp_line *line)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       int old_refcnt = line->refcnt--;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGPIL(line, DLINP, LOGL_DEBUG, "Line '%s' (%p) reference count put: %d -> %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-       line->name, line, old_refcnt, line->refcnt);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (line->refcnt == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Remove our counter group from libosmocore's global counter</span><br><span style="color: hsl(0, 100%, 40%);">-                * list if we are freeing the last remaining talloc context.</span><br><span style="color: hsl(0, 100%, 40%);">-             * Otherwise we get a use-after-free when libosmocore's timer</span><br><span style="color: hsl(0, 100%, 40%);">-                * ticks again and attempts to update these counters (OS#3011).</span><br><span style="color: hsl(0, 100%, 40%);">-          *</span><br><span style="color: hsl(0, 100%, 40%);">-               * Note that talloc internally counts "secondary" references</span><br><span style="color: hsl(0, 100%, 40%);">-           * _in addition to_ the initial allocation context, so yes,</span><br><span style="color: hsl(0, 100%, 40%);">-              * we must check for *zero* remaining secondary contexts here. */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (talloc_reference_count(line->rate_ctr) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_group_free(line->rate_ctr);</span><br><span style="color: hsl(0, 100%, 40%);">-         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* We are not freeing the last talloc context.</span><br><span style="color: hsl(0, 100%, 40%);">-                   * Instead of calling talloc_free(), unlink this 'line' pointer</span><br><span style="color: hsl(0, 100%, 40%);">-                  * which serves as one of several talloc contexts for the rate</span><br><span style="color: hsl(0, 100%, 40%);">-                   * counters and driver private state. */</span><br><span style="color: hsl(0, 100%, 40%);">-                        talloc_unlink(line, line->rate_ctr);</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (line->driver_data)</span><br><span style="color: hsl(0, 100%, 40%);">-                               talloc_unlink(line, line->driver_data);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-               talloc_free(line);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(120, 100%, 40%);">+     e1inp_line_put2(line, "unknown");</span><br><span> }</span><br><span> </span><br><span> void</span><br><span>@@ -586,7 +609,7 @@</span><br><span>   link->tei = tei;</span><br><span>  link->sapi = sapi;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       e1inp_line_get(link->ts->line);</span><br><span style="color: hsl(120, 100%, 40%);">+ e1inp_line_get2(link->ts->line, "e1inp_sign_link");</span><br><span> </span><br><span>      llist_add_tail(&link->list, &ts->sign.sign_links);</span><br><span> </span><br><span>@@ -609,7 +632,7 @@</span><br><span>   if (link->ts->line->driver->close)</span><br><span>               link->ts->line->driver->close(link);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    e1inp_line_put(link->ts->line);</span><br><span style="color: hsl(120, 100%, 40%);">+ e1inp_line_put2(link->ts->line, "e1inp_sign_link");</span><br><span>  talloc_free(link);</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c</span><br><span>index 917a195..5d17839 100644</span><br><span>--- a/src/input/ipaccess.c</span><br><span>+++ b/src/input/ipaccess.c</span><br><span>@@ -293,7 +293,7 @@</span><br><span>                       /* Finally, we know which OML link is associated with</span><br><span>                         * this RSL link, attach it to this socket. */</span><br><span>                       bfd->data = new_line = sign_link->ts->line;</span><br><span style="color: hsl(0, 100%, 40%);">-                    e1inp_line_get(new_line);</span><br><span style="color: hsl(120, 100%, 40%);">+                     e1inp_line_get2(new_line, "ipa_bfd");</span><br><span>                      ts = e1inp_line_ipa_rsl_ts(new_line, unit_data.trx_id);</span><br><span>                      newbfd = &ts->driver.ipaccess.fd;</span><br><span> </span><br><span>@@ -310,7 +310,7 @@</span><br><span>                           goto err;</span><br><span>                    }</span><br><span>                    /* now we can release the dummy RSL line. */</span><br><span style="color: hsl(0, 100%, 40%);">-                    e1inp_line_put(line);</span><br><span style="color: hsl(120, 100%, 40%);">+                 e1inp_line_put2(line, "ipa_bfd");</span><br><span> </span><br><span>                      e1i_ts = ipaccess_line_ts(newbfd, new_line);</span><br><span>                         ipaccess_bsc_keepalive_fsm_alloc(e1i_ts, newbfd, "rsl_bsc_to_bts");</span><br><span>@@ -328,7 +328,7 @@</span><br><span>          close(bfd->fd);</span><br><span>           bfd->fd = -1;</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       e1inp_line_put(line);</span><br><span style="color: hsl(120, 100%, 40%);">+ e1inp_line_put2(line, "ipa_bfd");</span><br><span>  return -1;</span><br><span> }</span><br><span> </span><br><span>@@ -603,7 +603,7 @@</span><br><span>    struct osmo_fd *bfd;</span><br><span> </span><br><span>     /* clone virtual E1 line for this new OML link. */</span><br><span style="color: hsl(0, 100%, 40%);">-      line = e1inp_line_clone(tall_ipa_ctx, link->line);</span><br><span style="color: hsl(120, 100%, 40%);">+ line = e1inp_line_clone(tall_ipa_ctx, link->line, "ipa_bfd");</span><br><span>   if (line == NULL) {</span><br><span>          LOGP(DLINP, LOGL_ERROR, "could not clone E1 line\n");</span><br><span>              return -ENOMEM;</span><br><span>@@ -642,7 +642,7 @@</span><br><span> err_line:</span><br><span>   close(bfd->fd);</span><br><span>   bfd->fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        e1inp_line_put(line);</span><br><span style="color: hsl(120, 100%, 40%);">+ e1inp_line_put2(line, "ipa_bfd");</span><br><span>  return ret;</span><br><span> }</span><br><span> </span><br><span>@@ -655,7 +655,7 @@</span><br><span> </span><br><span>         /* We don't know yet which OML link to associate it with. Thus, we</span><br><span>          * allocate a temporary E1 line until we have received ID. */</span><br><span style="color: hsl(0, 100%, 40%);">-       line = e1inp_line_clone(tall_ipa_ctx, link->line);</span><br><span style="color: hsl(120, 100%, 40%);">+ line = e1inp_line_clone(tall_ipa_ctx, link->line, "ipa_bfd");</span><br><span>   if (line == NULL) {</span><br><span>          LOGP(DLINP, LOGL_ERROR, "could not clone E1 line\n");</span><br><span>              return -ENOMEM;</span><br><span>@@ -692,7 +692,7 @@</span><br><span> err_line:</span><br><span>   close(bfd->fd);</span><br><span>   bfd->fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        e1inp_line_put(line);</span><br><span style="color: hsl(120, 100%, 40%);">+ e1inp_line_put2(line, "ipa_bfd");</span><br><span>  return ret;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-abis/+/19256">change 19256</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmo-abis/+/19256"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-abis </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0658b2e9c452598025cc0f1d0b060076171767cc </div>
<div style="display:none"> Gerrit-Change-Number: 19256 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>