<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13062">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">use osmo_static_string() instead of numerous static buffers<br><br>Change-Id: Id0eab72fa71630c8eb9edafaa370a41ca16329aa<br>---<br>M include/osmocom/gsm/gsm0808_utils.h<br>M include/osmocom/gsm/gsm23003.h<br>M src/fsm.c<br>M src/gb/gprs_ns.c<br>M src/gsm/abis_nm.c<br>M src/gsm/apn.c<br>M src/gsm/gsm0808_utils.c<br>M src/gsm/gsm23003.c<br>M src/gsm/gsm48.c<br>M src/gsm/gsm_utils.c<br>M src/gsm/rsl.c<br>M src/msgb.c<br>M src/sim/core.c<br>M src/socket.c<br>M src/utils.c<br>15 files changed, 119 insertions(+), 94 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/62/13062/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsm0808_utils.h b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>index e1e345d..4ca355a 100644</span><br><span>--- a/include/osmocom/gsm/gsm0808_utils.h</span><br><span>+++ b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>@@ -73,7 +73,8 @@</span><br><span> { return get_value_string(gsm0808_cell_id_discr_names, id_discr); }</span><br><span> </span><br><span> const char *gsm0808_cell_id_name(const struct gsm0808_cell_id *cid);</span><br><span style="color: hsl(0, 100%, 40%);">-const char *gsm0808_cell_id_name2(const struct gsm0808_cell_id *cid);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *gsm0808_cell_id_name2(const struct gsm0808_cell_id *cid)</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_DEPRECATED("Use gsm0808_cell_id_name() instead, which now returns distinct static buffers for every invocation");</span><br><span> const char *gsm0808_cell_id_list_name(const struct gsm0808_cell_id_list2 *cil);</span><br><span> int gsm0808_cell_id_list_name_buf(char *buf, size_t buflen, const struct gsm0808_cell_id_list2 *cil);</span><br><span> int gsm0808_cell_id_u_name(char *buf, size_t buflen,</span><br><span>diff --git a/include/osmocom/gsm/gsm23003.h b/include/osmocom/gsm/gsm23003.h</span><br><span>index b34a677..7c04760 100644</span><br><span>--- a/include/osmocom/gsm/gsm23003.h</span><br><span>+++ b/include/osmocom/gsm/gsm23003.h</span><br><span>@@ -99,9 +99,11 @@</span><br><span> const char *osmo_mnc_name(uint16_t mnc, bool mnc_3_digits);</span><br><span> const char *osmo_plmn_name(const struct osmo_plmn_id *plmn);</span><br><span> const char *osmo_plmn_name2(const struct osmo_plmn_id *plmn);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_DEPRECATED("Use osmo_plmn_name() instead, which now returns distinct static buffers for every invocation");</span><br><span> const char *osmo_lai_name(const struct osmo_location_area_id *lai);</span><br><span> const char *osmo_cgi_name(const struct osmo_cell_global_id *cgi);</span><br><span> const char *osmo_cgi_name2(const struct osmo_cell_global_id *cgi);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_DEPRECATED("Use osmo_cgi_name() instead, which now returns distinct static buffers for every invocation");</span><br><span> const char *osmo_gummei_name(const struct osmo_gummei *gummei);</span><br><span> </span><br><span> void osmo_plmn_to_bcd(uint8_t *bcd_dst, const struct osmo_plmn_id *plmn);</span><br><span>diff --git a/src/fsm.c b/src/fsm.c</span><br><span>index 6e15ab7..e8c008e 100644</span><br><span>--- a/src/fsm.c</span><br><span>+++ b/src/fsm.c</span><br><span>@@ -391,9 +391,10 @@</span><br><span>  */</span><br><span> const char *osmo_fsm_event_name(struct osmo_fsm *fsm, uint32_t event)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      static char buf[32];</span><br><span>         if (!fsm->event_names) {</span><br><span style="color: hsl(0, 100%, 40%);">-             snprintf(buf, sizeof(buf), "%"PRIu32, event);</span><br><span style="color: hsl(120, 100%, 40%);">+               const size_t len = 32;</span><br><span style="color: hsl(120, 100%, 40%);">+                char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+          snprintf(buf, len, "%"PRIu32, event);</span><br><span>              return buf;</span><br><span>  } else</span><br><span>               return get_value_string(fsm->event_names, event);</span><br><span>@@ -421,9 +422,10 @@</span><br><span>  */</span><br><span> const char *osmo_fsm_state_name(struct osmo_fsm *fsm, uint32_t state)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        static char buf[32];</span><br><span>         if (state >= fsm->num_states) {</span><br><span style="color: hsl(0, 100%, 40%);">-           snprintf(buf, sizeof(buf), "unknown %"PRIu32, state);</span><br><span style="color: hsl(120, 100%, 40%);">+               const size_t len = 32;</span><br><span style="color: hsl(120, 100%, 40%);">+                char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+          snprintf(buf, len, "unknown %"PRIu32, state);</span><br><span>              return buf;</span><br><span>  } else</span><br><span>               return fsm->states[state].name;</span><br><span>diff --git a/src/gb/gprs_ns.c b/src/gb/gprs_ns.c</span><br><span>index 54964d3..5706701 100644</span><br><span>--- a/src/gb/gprs_ns.c</span><br><span>+++ b/src/gb/gprs_ns.c</span><br><span>@@ -1203,15 +1203,16 @@</span><br><span> </span><br><span> const char *gprs_ns_ll_str(const struct gprs_nsvc *nsvc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  static char buf[80];</span><br><span style="color: hsl(120, 100%, 40%);">+  const size_t buflen = 80;</span><br><span style="color: hsl(120, 100%, 40%);">+     char *buf = osmo_static_string(buflen);</span><br><span> </span><br><span>  switch(nsvc->ll) {</span><br><span>        case GPRS_NS_LL_UDP:</span><br><span style="color: hsl(0, 100%, 40%);">-            snprintf(buf, sizeof(buf), "%s:%u",</span><br><span style="color: hsl(120, 100%, 40%);">+         snprintf(buf, buflen, "%s:%u",</span><br><span>                      inet_ntoa(nsvc->ip.bts_addr.sin_addr), osmo_ntohs(nsvc->ip.bts_addr.sin_port));</span><br><span>               break;</span><br><span>       case GPRS_NS_LL_FR_GRE:</span><br><span style="color: hsl(0, 100%, 40%);">-         snprintf(buf, sizeof(buf), "%s:%u",</span><br><span style="color: hsl(120, 100%, 40%);">+         snprintf(buf, buflen, "%s:%u",</span><br><span>                      inet_ntoa(nsvc->frgre.bts_addr.sin_addr), osmo_ntohs(nsvc->frgre.bts_addr.sin_port));</span><br><span>                 break;</span><br><span>       default:</span><br><span>@@ -1219,7 +1220,7 @@</span><br><span>             break;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   buf[sizeof(buf) - 1] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[buflen - 1] = '\0';</span><br><span> </span><br><span>  return buf;</span><br><span> }</span><br><span>diff --git a/src/gsm/abis_nm.c b/src/gsm/abis_nm.c</span><br><span>index 49d05ba..5b8df57 100644</span><br><span>--- a/src/gsm/abis_nm.c</span><br><span>+++ b/src/gsm/abis_nm.c</span><br><span>@@ -930,8 +930,9 @@</span><br><span> </span><br><span> const char *abis_nm_dump_foh(const struct abis_om_fom_hdr *foh)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     static char foh_buf[128];</span><br><span style="color: hsl(0, 100%, 40%);">-       snprintf(foh_buf, sizeof(foh_buf), "OC=%s(%02x) INST=(%02x,%02x,%02x)",</span><br><span style="color: hsl(120, 100%, 40%);">+     const size_t len = 128;</span><br><span style="color: hsl(120, 100%, 40%);">+       char *foh_buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+      snprintf(foh_buf, len, "OC=%s(%02x) INST=(%02x,%02x,%02x)",</span><br><span>                get_value_string(abis_nm_obj_class_names, foh->obj_class),</span><br><span>                foh->obj_class, foh->obj_inst.bts_nr, foh->obj_inst.trx_nr,</span><br><span>                 foh->obj_inst.ts_nr);</span><br><span>diff --git a/src/gsm/apn.c b/src/gsm/apn.c</span><br><span>index 2674663..99030d4 100644</span><br><span>--- a/src/gsm/apn.c</span><br><span>+++ b/src/gsm/apn.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> #include <stdlib.h></span><br><span> #include <string.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span> #include <osmocom/gsm/apn.h></span><br><span> </span><br><span> #define APN_OI_GPRS_FMT "mnc%03u.mcc%03u.gprs"</span><br><span>@@ -34,9 +35,11 @@</span><br><span> </span><br><span> char *osmo_apn_qualify(unsigned int mcc, unsigned int mnc, const char *ni)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    snprintf(apn_strbuf, sizeof(apn_strbuf)-1, APN_GPRS_FMT,</span><br><span style="color: hsl(120, 100%, 40%);">+      const size_t len = APN_MAXLEN+1;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(buf, len-1, APN_GPRS_FMT,</span><br><span>           ni, mnc, mcc);</span><br><span style="color: hsl(0, 100%, 40%);">-  apn_strbuf[sizeof(apn_strbuf)-1] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+      apn_strbuf[len-1] = '\0';</span><br><span> </span><br><span>        return apn_strbuf;</span><br><span> }</span><br><span>diff --git a/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c</span><br><span>index 54ec19c..eee6b2b 100644</span><br><span>--- a/src/gsm/gsm0808_utils.c</span><br><span>+++ b/src/gsm/gsm0808_utils.c</span><br><span>@@ -1581,8 +1581,7 @@</span><br><span>  */</span><br><span> const char *gsm0808_cell_id_name(const struct gsm0808_cell_id *cid)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     static char buf[64];</span><br><span style="color: hsl(0, 100%, 40%);">-    return gsm0808_cell_id_name_buf(cid, buf, sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+       return gsm0808_cell_id_name_buf(cid, OSMO_STATIC_STRING(64));</span><br><span> }</span><br><span> </span><br><span> /*! Like gsm0808_cell_id_name() but uses a different static buffer.</span><br><span>@@ -1591,8 +1590,7 @@</span><br><span>  */</span><br><span> const char *gsm0808_cell_id_name2(const struct gsm0808_cell_id *cid)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       static char buf[64];</span><br><span style="color: hsl(0, 100%, 40%);">-    return gsm0808_cell_id_name_buf(cid, buf, sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+       return gsm0808_cell_id_name(cid);</span><br><span> }</span><br><span> </span><br><span> /*! Return a human readable representation of the Cell Identifier List, like</span><br><span>@@ -1640,8 +1638,9 @@</span><br><span>  * See also gsm0808_cell_id_list_name_buf(). */</span><br><span> const char *gsm0808_cell_id_list_name(const struct gsm0808_cell_id_list2 *cil)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    static char buf[1024];</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm0808_cell_id_list_name_buf(buf, sizeof(buf), cil);</span><br><span style="color: hsl(120, 100%, 40%);">+ const size_t len = 1024;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  gsm0808_cell_id_list_name_buf(buf, len, cil);</span><br><span>        return buf;</span><br><span> }</span><br><span> </span><br><span>@@ -1650,8 +1649,9 @@</span><br><span> </span><br><span> const char *gsm0808_channel_type_name(const struct gsm0808_channel_type *ct)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   static char buf[128];</span><br><span style="color: hsl(0, 100%, 40%);">-   snprintf(buf, sizeof(buf), "ch_indctr=0x%x ch_rate_type=0x%x perm_spch=%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ const size_t len = 128;</span><br><span style="color: hsl(120, 100%, 40%);">+       char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(buf, len, "ch_indctr=0x%x ch_rate_type=0x%x perm_spch=%s",</span><br><span>                 ct->ch_indctr, ct->ch_rate_type,</span><br><span>               osmo_hexdump(ct->perm_spch, ct->perm_spch_len));</span><br><span>      return buf;</span><br><span>diff --git a/src/gsm/gsm23003.c b/src/gsm/gsm23003.c</span><br><span>index 95fca91..0f3fa2d 100644</span><br><span>--- a/src/gsm/gsm23003.c</span><br><span>+++ b/src/gsm/gsm23003.c</span><br><span>@@ -95,8 +95,9 @@</span><br><span>  */</span><br><span> const char *osmo_mcc_name(uint16_t mcc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     static char buf[8];</span><br><span style="color: hsl(0, 100%, 40%);">-     snprintf(buf, sizeof(buf), "%03u", mcc);</span><br><span style="color: hsl(120, 100%, 40%);">+    const size_t len = 8;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(buf, len, "%03u", mcc);</span><br><span>   return buf;</span><br><span> }</span><br><span> </span><br><span>@@ -107,8 +108,9 @@</span><br><span>  */</span><br><span> const char *osmo_mnc_name(uint16_t mnc, bool mnc_3_digits)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    static char buf[8];</span><br><span style="color: hsl(0, 100%, 40%);">-     snprintf(buf, sizeof(buf), "%0*u", mnc_3_digits ? 3 : 2, mnc);</span><br><span style="color: hsl(120, 100%, 40%);">+      const size_t len = 8;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(buf, len, "%0*u", mnc_3_digits ? 3 : 2, mnc);</span><br><span>     return buf;</span><br><span> }</span><br><span> </span><br><span>@@ -124,8 +126,9 @@</span><br><span>  */</span><br><span> const char *osmo_plmn_name(const struct osmo_plmn_id *plmn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   static char buf[16];</span><br><span style="color: hsl(0, 100%, 40%);">-    plmn_name(buf, sizeof(buf), plmn);</span><br><span style="color: hsl(120, 100%, 40%);">+    const size_t len = 16;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  plmn_name(buf, len, plmn);</span><br><span>   return buf;</span><br><span> }</span><br><span> </span><br><span>@@ -135,9 +138,7 @@</span><br><span>  */</span><br><span> const char *osmo_plmn_name2(const struct osmo_plmn_id *plmn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  static char buf[16];</span><br><span style="color: hsl(0, 100%, 40%);">-    plmn_name(buf, sizeof(buf), plmn);</span><br><span style="color: hsl(0, 100%, 40%);">-      return buf;</span><br><span style="color: hsl(120, 100%, 40%);">+   return osmo_plmn_name(plmn);</span><br><span> }</span><br><span> </span><br><span> /*! Return MCC-MNC-LAC as string, in a static buffer.</span><br><span>@@ -146,8 +147,9 @@</span><br><span>  */</span><br><span> const char *osmo_lai_name(const struct osmo_location_area_id *lai)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  static char buf[32];</span><br><span style="color: hsl(0, 100%, 40%);">-    snprintf(buf, sizeof(buf), "%s-%u", osmo_plmn_name(&lai->plmn), lai->lac);</span><br><span style="color: hsl(120, 100%, 40%);">+        const size_t len = 32;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(buf, len, "%s-%u", osmo_plmn_name(&lai->plmn), lai->lac);</span><br><span>       return buf;</span><br><span> }</span><br><span> </span><br><span>@@ -163,8 +165,9 @@</span><br><span>  */</span><br><span> const char *osmo_cgi_name(const struct osmo_cell_global_id *cgi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      static char buf[32];</span><br><span style="color: hsl(0, 100%, 40%);">-    return _cgi_name(cgi, buf, sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+      const size_t len = 32;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  return _cgi_name(cgi, buf, len);</span><br><span> }</span><br><span> </span><br><span> /*! Same as osmo_cgi_name(), but uses a different static buffer.</span><br><span>@@ -174,8 +177,7 @@</span><br><span>  */</span><br><span> const char *osmo_cgi_name2(const struct osmo_cell_global_id *cgi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    static char buf[32];</span><br><span style="color: hsl(0, 100%, 40%);">-    return _cgi_name(cgi, buf, sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+      return osmo_cgi_name(cgi);</span><br><span> }</span><br><span> </span><br><span> static void to_bcd(uint8_t *bcd, uint16_t val)</span><br><span>@@ -189,8 +191,9 @@</span><br><span> </span><br><span> const char *osmo_gummei_name(const struct osmo_gummei *gummei)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  static char buf[32];</span><br><span style="color: hsl(0, 100%, 40%);">-    snprintf(buf, sizeof(buf), "%s-%04x-%02x", osmo_plmn_name(&gummei->plmn),</span><br><span style="color: hsl(120, 100%, 40%);">+    const size_t len = 32;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(buf, len, "%s-%04x-%02x", osmo_plmn_name(&gummei->plmn),</span><br><span>            gummei->mme.group_id, gummei->mme.code);</span><br><span>      return buf;</span><br><span> }</span><br><span>diff --git a/src/gsm/gsm48.c b/src/gsm/gsm48.c</span><br><span>index 4166c15..d91c9ae 100644</span><br><span>--- a/src/gsm/gsm48.c</span><br><span>+++ b/src/gsm/gsm48.c</span><br><span>@@ -188,8 +188,9 @@</span><br><span>  */</span><br><span> const char *osmo_rai_name(const struct gprs_ra_id *rai)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  static char buf[32];</span><br><span style="color: hsl(0, 100%, 40%);">-    snprintf(buf, sizeof(buf), "%s-%s-%u-%u",</span><br><span style="color: hsl(120, 100%, 40%);">+   const size_t len = 32;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(buf, len, "%s-%s-%u-%u",</span><br><span>           osmo_mcc_name(rai->mcc), osmo_mnc_name(rai->mnc, rai->mnc_3_digits), rai->lac,</span><br><span>           rai->rac);</span><br><span>       return buf;</span><br><span>@@ -440,7 +441,8 @@</span><br><span>  */</span><br><span> const char *osmo_mi_name(const uint8_t *mi, uint8_t mi_len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    static char mi_name[10 + GSM48_MI_SIZE + 1];</span><br><span style="color: hsl(120, 100%, 40%);">+  const size_t mi_name_len = 10 + GSM48_MI_SIZE + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    char *mi_name = osmo_static_string(mi_name_len);</span><br><span>     uint8_t mi_type;</span><br><span>     uint32_t tmsi;</span><br><span>       char mi_string[GSM48_MI_SIZE];</span><br><span>@@ -452,7 +454,7 @@</span><br><span>                 /* Table 10.5.4.3, reverse generate_mid_from_tmsi */</span><br><span>                 if (mi_len == GSM48_TMSI_LEN && mi[0] == (0xf0 | GSM_MI_TYPE_TMSI)) {</span><br><span>                        tmsi = osmo_load32be(&mi[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                       snprintf(mi_name, sizeof(mi_name), "TMSI-0x%08" PRIX32, tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                      snprintf(mi_name, mi_name_len, "TMSI-0x%08" PRIX32, tmsi);</span><br><span>                         return mi_name;</span><br><span>              }</span><br><span>            return "TMSI-invalid";</span><br><span>@@ -461,7 +463,7 @@</span><br><span>       case GSM_MI_TYPE_IMEI:</span><br><span>       case GSM_MI_TYPE_IMEISV:</span><br><span>             osmo_bcd2str(mi_string, sizeof(mi_string), mi, 1, (mi_len * 2) - (mi[0] & GSM_MI_ODD ? 0 : 1), true);</span><br><span style="color: hsl(0, 100%, 40%);">-               snprintf(mi_name, sizeof(mi_name), "%s-%s", gsm48_mi_type_name(mi_type), mi_string);</span><br><span style="color: hsl(120, 100%, 40%);">+                snprintf(mi_name, mi_name_len, "%s-%s", gsm48_mi_type_name(mi_type), mi_string);</span><br><span>           return mi_name;</span><br><span> </span><br><span>  default:</span><br><span>@@ -1059,7 +1061,8 @@</span><br><span>  */</span><br><span> const char *gsm48_pdisc_msgtype_name(uint8_t pdisc, uint8_t msg_type)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   static char namebuf[64];</span><br><span style="color: hsl(120, 100%, 40%);">+      const size_t len = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *buf = osmo_static_string(len);</span><br><span>         const struct value_string *msgt_names;</span><br><span> </span><br><span>   switch (pdisc) {</span><br><span>@@ -1083,9 +1086,9 @@</span><br><span>     if (msgt_names)</span><br><span>              return get_value_string(msgt_names, msg_type);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      snprintf(namebuf, sizeof(namebuf), "%s:0x%02x",</span><br><span style="color: hsl(120, 100%, 40%);">+     snprintf(buf, len, "%s:0x%02x",</span><br><span>             gsm48_pdisc_name(pdisc), msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-    return namebuf;</span><br><span style="color: hsl(120, 100%, 40%);">+       return buf;</span><br><span> }</span><br><span> </span><br><span> const struct value_string gsm48_reject_value_names[] = {</span><br><span>@@ -1189,7 +1192,8 @@</span><br><span>  */</span><br><span> const char *osmo_gsm48_classmark_a5_name(const struct osmo_gsm48_classmark *cm)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- static char buf[128];</span><br><span style="color: hsl(120, 100%, 40%);">+ const size_t len = 128;</span><br><span style="color: hsl(120, 100%, 40%);">+       char *buf = osmo_static_string(len);</span><br><span>         char cm1[42] = "no-cm1";</span><br><span>   char cm2[42] = " no-cm2";</span><br><span>  char cm3[42] = " no-cm2";</span><br><span>@@ -1212,7 +1216,7 @@</span><br><span>                   cm->classmark3[0] & (1 << 2) ? " A5/6" : "",</span><br><span>                        cm->classmark3[0] & (1 << 3) ? " A5/7" : "");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     snprintf(buf, sizeof(buf), "%s%s%s", cm1, cm2, cm3);</span><br><span style="color: hsl(120, 100%, 40%);">+        snprintf(buf, len, "%s%s%s", cm1, cm2, cm3);</span><br><span>       return buf;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/gsm/gsm_utils.c b/src/gsm/gsm_utils.c</span><br><span>index 02cb3d5..8ae63e4 100644</span><br><span>--- a/src/gsm/gsm_utils.c</span><br><span>+++ b/src/gsm/gsm_utils.c</span><br><span>@@ -883,11 +883,12 @@</span><br><span> </span><br><span> char *osmo_dump_gsmtime(const struct gsm_time *tm)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    static char buf[64];</span><br><span style="color: hsl(120, 100%, 40%);">+  const size_t len = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *buf = osmo_static_string(len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        snprintf(buf, sizeof(buf), "%06"PRIu32"/%02"PRIu16"/%02"PRIu8"/%02"PRIu8"/%02"PRIu8,</span><br><span style="color: hsl(120, 100%, 40%);">+        snprintf(buf, len, "%06"PRIu32"/%02"PRIu16"/%02"PRIu8"/%02"PRIu8"/%02"PRIu8,</span><br><span>                tm->fn, tm->t1, tm->t2, tm->t3, (uint8_t)tm->fn%52);</span><br><span style="color: hsl(0, 100%, 40%);">-    buf[sizeof(buf)-1] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+    buf[len-1] = '\0';</span><br><span>   return buf;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/gsm/rsl.c b/src/gsm/rsl.c</span><br><span>index e610ebf..47bd815 100644</span><br><span>--- a/src/gsm/rsl.c</span><br><span>+++ b/src/gsm/rsl.c</span><br><span>@@ -218,7 +218,7 @@</span><br><span> /*! Get human-readable string for RSL channel number */</span><br><span> const char *rsl_chan_nr_str(uint8_t chan_nr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     static char str[20];</span><br><span style="color: hsl(120, 100%, 40%);">+  char *str = osmo_static_string(20);</span><br><span>  int ts = chan_nr & 7;</span><br><span>    uint8_t cbits = chan_nr >> 3;</span><br><span> </span><br><span>diff --git a/src/msgb.c b/src/msgb.c</span><br><span>index 3902f6e..2372c64 100644</span><br><span>--- a/src/msgb.c</span><br><span>+++ b/src/msgb.c</span><br><span>@@ -398,7 +398,8 @@</span><br><span>  */</span><br><span> const char *msgb_hexdump(const struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      static char buf[4100];</span><br><span style="color: hsl(120, 100%, 40%);">+        const size_t len = 4100;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *buf = osmo_static_string(len);</span><br><span>         int buf_offs = 0;</span><br><span>    int nchars;</span><br><span>  const unsigned char *start = msg->data;</span><br><span>@@ -421,32 +422,32 @@</span><br><span>           if (lxhs[i] > msg->tail)</span><br><span>                       continue;</span><br><span>            if (lxhs[i] < msg->data || lxhs[i] > msg->tail) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,</span><br><span style="color: hsl(120, 100%, 40%);">+                     nchars = snprintf(buf + buf_offs, len - buf_offs,</span><br><span>                                      "(L%d=data%+" PRIdPTR ") ",</span><br><span>                                      i+1, lxhs[i] - msg->data);</span><br><span>                      buf_offs += nchars;</span><br><span>                  continue;</span><br><span>            }</span><br><span>            if (lxhs[i] < start) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,</span><br><span style="color: hsl(120, 100%, 40%);">+                     nchars = snprintf(buf + buf_offs, len - buf_offs,</span><br><span>                                      "(L%d%+" PRIdPTR ") ", i+1,</span><br><span>                                      start - lxhs[i]);</span><br><span>                  buf_offs += nchars;</span><br><span>                  continue;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-               nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,</span><br><span style="color: hsl(120, 100%, 40%);">+             nchars = snprintf(buf + buf_offs, len - buf_offs,</span><br><span>                              "%s[L%d]> ",</span><br><span>                            osmo_hexdump(start, lxhs[i] - start),</span><br><span>                                i+1);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (nchars < 0 || nchars + buf_offs >= sizeof(buf))</span><br><span style="color: hsl(120, 100%, 40%);">+             if (nchars < 0 || nchars + buf_offs >= len)</span><br><span>                    return "ERROR";</span><br><span> </span><br><span>                buf_offs += nchars;</span><br><span>          start = lxhs[i];</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,</span><br><span style="color: hsl(120, 100%, 40%);">+     nchars = snprintf(buf + buf_offs, len - buf_offs,</span><br><span>                      "%s", osmo_hexdump(start, msg->tail - start));</span><br><span style="color: hsl(0, 100%, 40%);">-   if (nchars < 0 || nchars + buf_offs >= sizeof(buf))</span><br><span style="color: hsl(120, 100%, 40%);">+     if (nchars < 0 || nchars + buf_offs >= len)</span><br><span>            return "ERROR";</span><br><span> </span><br><span>        buf_offs += nchars;</span><br><span>@@ -456,17 +457,17 @@</span><br><span>                  continue;</span><br><span> </span><br><span>                if (lxhs[i] < msg->head || lxhs[i] > msg->head + msg->data_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,</span><br><span style="color: hsl(120, 100%, 40%);">+                     nchars = snprintf(buf + buf_offs, len - buf_offs,</span><br><span>                                      "(L%d out of range) ", i+1);</span><br><span>             } else if (lxhs[i] <= msg->data + msg->data_len &&</span><br><span>                     lxhs[i] > msg->tail) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,</span><br><span style="color: hsl(120, 100%, 40%);">+                     nchars = snprintf(buf + buf_offs, len - buf_offs,</span><br><span>                                      "(L%d=tail%+" PRIdPTR ") ",</span><br><span>                                      i+1, lxhs[i] - msg->tail);</span><br><span>              } else</span><br><span>                       continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           if (nchars < 0 || nchars + buf_offs >= sizeof(buf))</span><br><span style="color: hsl(120, 100%, 40%);">+             if (nchars < 0 || nchars + buf_offs >= len)</span><br><span>                    return "ERROR";</span><br><span>            buf_offs += nchars;</span><br><span>  }</span><br><span>diff --git a/src/sim/core.c b/src/sim/core.c</span><br><span>index a78cecc..3476cf9 100644</span><br><span>--- a/src/sim/core.c</span><br><span>+++ b/src/sim/core.c</span><br><span>@@ -267,11 +267,10 @@</span><br><span>       return msg;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: do we want to mark this as __thread? */</span><br><span style="color: hsl(0, 100%, 40%);">-static char sw_print_buf[256];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> char *osim_print_sw(const struct osim_card_hdl *ch, uint16_t sw_in)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       const size_t len = 256;</span><br><span style="color: hsl(120, 100%, 40%);">+       char *buf = osmo_static_string(len);</span><br><span>         const struct osim_card_sw *csw;</span><br><span> </span><br><span>  if (!ch || !ch->prof)</span><br><span>@@ -283,23 +282,23 @@</span><br><span> </span><br><span>         switch (csw->type) {</span><br><span>      case SW_TYPE_STR:</span><br><span style="color: hsl(0, 100%, 40%);">-               snprintf(sw_print_buf, sizeof(sw_print_buf),</span><br><span style="color: hsl(120, 100%, 40%);">+          snprintf(buf, len,</span><br><span>                    "%04x (%s)", sw_in, csw->u.str);</span><br><span>               break;</span><br><span>       default:</span><br><span>             goto ret_def;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   sw_print_buf[sizeof(sw_print_buf)-1] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[len-1] = '\0';</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  return sw_print_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+  return buf;</span><br><span> </span><br><span> ret_def:</span><br><span style="color: hsl(0, 100%, 40%);">-     snprintf(sw_print_buf, sizeof(sw_print_buf),</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(buf, len,</span><br><span>            "%04x (Unknown)", sw_in);</span><br><span style="color: hsl(0, 100%, 40%);">-    sw_print_buf[sizeof(sw_print_buf)-1] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[len-1] = '\0';</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  return sw_print_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+  return buf;</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/src/socket.c b/src/socket.c</span><br><span>index 37fd584..44b470d 100644</span><br><span>--- a/src/socket.c</span><br><span>+++ b/src/socket.c</span><br><span>@@ -822,8 +822,9 @@</span><br><span>  */</span><br><span> const char *osmo_sock_get_name2(int fd)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      static char str[OSMO_SOCK_NAME_MAXLEN];</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_sock_get_name_buf(str, sizeof(str), fd);</span><br><span style="color: hsl(120, 100%, 40%);">+ const size_t len = OSMO_SOCK_NAME_MAXLEN;</span><br><span style="color: hsl(120, 100%, 40%);">+     char *str = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_sock_get_name_buf(str, len, fd);</span><br><span>        return str;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/utils.c b/src/utils.c</span><br><span>index 12189b6..ab386f7 100644</span><br><span>--- a/src/utils.c</span><br><span>+++ b/src/utils.c</span><br><span>@@ -41,8 +41,6 @@</span><br><span>  *</span><br><span>  * \file utils.c */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char namebuf[255];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /*! get human-readable string for given value</span><br><span>  *  \param[in] vs Array of value_string tuples</span><br><span>  *  \param[in] val Value to be converted</span><br><span>@@ -54,12 +52,15 @@</span><br><span>  */</span><br><span> const char *get_value_string(const struct value_string *vs, uint32_t val)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     char *namebuf;</span><br><span style="color: hsl(120, 100%, 40%);">+        const size_t len = 19;</span><br><span>       const char *str = get_value_string_or_null(vs, val);</span><br><span>         if (str)</span><br><span>             return str;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(namebuf, sizeof(namebuf), "unknown 0x%"PRIx32, val);</span><br><span style="color: hsl(0, 100%, 40%);">- namebuf[sizeof(namebuf) - 1] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+  namebuf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+    snprintf(namebuf, len, "unknown 0x%"PRIx32, val);</span><br><span style="color: hsl(120, 100%, 40%);">+   namebuf[len-1] = '\0';</span><br><span>       return namebuf;</span><br><span> }</span><br><span> </span><br><span>@@ -219,7 +220,6 @@</span><br><span>       return nibblepos >> 1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char hexd_buff[4096];</span><br><span> static const char hex_chars[] = "0123456789abcdef";</span><br><span> </span><br><span> /*! Convert binary sequence to hexadecimal ASCII string.</span><br><span>@@ -279,11 +279,13 @@</span><br><span>  */</span><br><span> char *osmo_ubit_dump(const uint8_t *bits, unsigned int len)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ const size_t buflen = OSMO_MIN(4096, len + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        char *buf = osmo_static_string(buflen);</span><br><span>      int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (len > sizeof(hexd_buff)-1)</span><br><span style="color: hsl(0, 100%, 40%);">-               len = sizeof(hexd_buff)-1;</span><br><span style="color: hsl(0, 100%, 40%);">-      memset(hexd_buff, 0, sizeof(hexd_buff));</span><br><span style="color: hsl(120, 100%, 40%);">+      if (len > buflen-1)</span><br><span style="color: hsl(120, 100%, 40%);">+                len = buflen - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     memset(buf, 0, buflen);</span><br><span> </span><br><span>  for (i = 0; i < len; i++) {</span><br><span>               char outch;</span><br><span>@@ -301,10 +303,10 @@</span><br><span>                  outch = 'E';</span><br><span>                         break;</span><br><span>               }</span><br><span style="color: hsl(0, 100%, 40%);">-               hexd_buff[i] = outch;</span><br><span style="color: hsl(120, 100%, 40%);">+         buf[i] = outch;</span><br><span>      }</span><br><span style="color: hsl(0, 100%, 40%);">-       hexd_buff[sizeof(hexd_buff)-1] = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     return hexd_buff;</span><br><span style="color: hsl(120, 100%, 40%);">+     buf[buflen-1] = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    return buf;</span><br><span> }</span><br><span> </span><br><span> /*! Convert binary sequence to hexadecimal ASCII string</span><br><span>@@ -320,8 +322,9 @@</span><br><span>  */</span><br><span> char *osmo_hexdump(const unsigned char *buf, int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_hexdump_buf(hexd_buff, sizeof(hexd_buff), buf, len, " ", true);</span><br><span style="color: hsl(0, 100%, 40%);">-  return hexd_buff;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* N bytes make 2N hex characters, plus N space delims, plus terminating nul */</span><br><span style="color: hsl(120, 100%, 40%);">+       const size_t buflen = OSMO_MIN(4096, len * (2 + 1) + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      return (char*)osmo_hexdump_buf(OSMO_STATIC_STRING(buflen), buf, len, " ", true);</span><br><span> }</span><br><span> </span><br><span> /*! Convert binary sequence to hexadecimal ASCII string</span><br><span>@@ -337,8 +340,9 @@</span><br><span>  */</span><br><span> char *osmo_hexdump_nospc(const unsigned char *buf, int len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_hexdump_buf(hexd_buff, sizeof(hexd_buff), buf, len, "", true);</span><br><span style="color: hsl(0, 100%, 40%);">-   return hexd_buff;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* N bytes make 2N hex characters, plus terminating nul */</span><br><span style="color: hsl(120, 100%, 40%);">+    const size_t buflen = OSMO_MIN(4096, len * 2 + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    return (char*)osmo_hexdump_buf(OSMO_STATIC_STRING(buflen), buf, len, "", true);</span><br><span> }</span><br><span> </span><br><span> /* Compat with previous typo to preserve abi */</span><br><span>@@ -622,7 +626,7 @@</span><br><span>  */</span><br><span> const char *osmo_escape_str(const char *str, int in_len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     return osmo_escape_str_buf(str, in_len, namebuf, sizeof(namebuf));</span><br><span style="color: hsl(120, 100%, 40%);">+    return osmo_escape_str_buf(str, in_len, OSMO_STATIC_STRING(254));</span><br><span> }</span><br><span> </span><br><span> /*! Like osmo_escape_str(), but returns double-quotes around a string, or "NULL" for a NULL string.</span><br><span>@@ -666,7 +670,7 @@</span><br><span>  */</span><br><span> const char *osmo_quote_str(const char *str, int in_len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        return osmo_quote_str_buf(str, in_len, namebuf, sizeof(namebuf));</span><br><span style="color: hsl(120, 100%, 40%);">+     return osmo_quote_str_buf(str, in_len, OSMO_STATIC_STRING(254));</span><br><span> }</span><br><span> </span><br><span> /*! perform an integer square root operation on unsigned 32bit integer.</span><br><span>@@ -747,8 +751,9 @@</span><br><span>  */</span><br><span> const char *osmo_str_tolower(const char *src)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- static char buf[128];</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_str_tolower_buf(buf, sizeof(buf), src);</span><br><span style="color: hsl(120, 100%, 40%);">+  const size_t len = 128;</span><br><span style="color: hsl(120, 100%, 40%);">+       char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_str_tolower_buf(buf, len, src);</span><br><span>         return buf;</span><br><span> }</span><br><span> </span><br><span>@@ -790,8 +795,9 @@</span><br><span>  */</span><br><span> const char *osmo_str_toupper(const char *src)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- static char buf[128];</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_str_toupper_buf(buf, sizeof(buf), src);</span><br><span style="color: hsl(120, 100%, 40%);">+  const size_t len = 128;</span><br><span style="color: hsl(120, 100%, 40%);">+       char *buf = osmo_static_string(len);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_str_toupper_buf(buf, len, src);</span><br><span>         return buf;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13062">change 13062</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/13062"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Id0eab72fa71630c8eb9edafaa370a41ca16329aa </div>
<div style="display:none"> Gerrit-Change-Number: 13062 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>