From 4a62eda225ab7f3c9556990c81a6fc5e19b5eec8 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 18 Mar 2019 18:27:00 +0100 Subject: Add _buf() functions to bypass static string buffers We have a number of static buffers in use in libosmo*. This means the related functions are not usable in a thread-safe way. While we so far don't have many multi-threaded programs in the osmocom universe, the static buffers also prevent us from calling the same e.g. string-ify function twice within a single printf() call. Let's make sure there's an alternative function in all those cases, where the user can pass in a caller-allocated buffer + size, and make the 'classic' function with the static buffer a wrapper around that _buf() variant. Change-Id: Ibf85f79e93244f53b2684ff6f1095c5b41203e05 --- include/osmocom/gsm/abis_nm.h | 1 + include/osmocom/gsm/apn.h | 3 +++ include/osmocom/gsm/gsm0808_utils.h | 3 +++ include/osmocom/gsm/gsm23003.h | 6 ++++++ include/osmocom/gsm/gsm48.h | 2 ++ include/osmocom/gsm/gsm_utils.h | 1 + include/osmocom/gsm/protocol/gsm_04_08.h | 2 ++ include/osmocom/gsm/rsl.h | 1 + 8 files changed, 19 insertions(+) (limited to 'include/osmocom/gsm') diff --git a/include/osmocom/gsm/abis_nm.h b/include/osmocom/gsm/abis_nm.h index 823b5a45..788727cd 100644 --- a/include/osmocom/gsm/abis_nm.h +++ b/include/osmocom/gsm/abis_nm.h @@ -42,6 +42,7 @@ extern const struct tlv_definition abis_nm_osmo_att_tlvdef; extern const struct tlv_definition abis_nm_att_tlvdef_ipa; const char *abis_nm_dump_foh(const struct abis_om_fom_hdr *foh); +char *abis_nm_dump_foh_buf(char *buf, size_t buf_len, const struct abis_om_fom_hdr *foh); /*! write a human-readable OML header to the debug log * \param[in] ss Logging sub-system diff --git a/include/osmocom/gsm/apn.h b/include/osmocom/gsm/apn.h index 288b229e..7899bb28 100644 --- a/include/osmocom/gsm/apn.h +++ b/include/osmocom/gsm/apn.h @@ -11,11 +11,14 @@ #define APN_MAXLEN 100 char *osmo_apn_qualify(unsigned int mcc, unsigned int mnc, const char *ni); +char *osmo_apn_qualify_buf(char *buf, size_t buf_len, unsigned int mcc, unsigned int mnc, const char *ni); /* Compose a string of the form '.mnc001.mcc002.gprs\0', returned in a * static buffer. */ char *osmo_apn_qualify_from_imsi(const char *imsi, const char *ni, int have_3dig_mnc); +char *osmo_apn_qualify_from_imsi_buf(char *buf, size_t buf_len, const char *imsi, + const char *ni, int have_3dig_mnc); int osmo_apn_from_str(uint8_t *apn_enc, size_t max_apn_enc_len, const char *str); char *osmo_apn_to_str(char *out_str, const uint8_t *apn_enc, size_t apn_enc_len); diff --git a/include/osmocom/gsm/gsm0808_utils.h b/include/osmocom/gsm/gsm0808_utils.h index dedb0298..e2469670 100644 --- a/include/osmocom/gsm/gsm0808_utils.h +++ b/include/osmocom/gsm/gsm0808_utils.h @@ -69,7 +69,9 @@ struct osmo_lcls { }; char *osmo_lcls_dump(const struct osmo_lcls *lcls); +char *osmo_lcls_dump_buf(char *buf, size_t buf_len, const struct osmo_lcls *lcls); char *osmo_gcr_dump(const struct osmo_lcls *lcls); +char *osmo_gcr_dump_buf(char *buf, size_t buf_len, const struct osmo_lcls *lcls); extern const struct value_string gsm0808_cell_id_discr_names[]; static inline const char *gsm0808_cell_id_discr_name(enum CELL_IDENT id_discr) @@ -251,5 +253,6 @@ static inline uint8_t gsm0808_chosen_channel(enum gsm_chan_t type, enum gsm48_ch } const char *gsm0808_channel_type_name(const struct gsm0808_channel_type *ct); +char *gsm0808_channel_type_name_buf(char *buf, size_t buf_len, const struct gsm0808_channel_type *ct); /*! @} */ diff --git a/include/osmocom/gsm/gsm23003.h b/include/osmocom/gsm/gsm23003.h index cf622ce0..88c4f3c2 100644 --- a/include/osmocom/gsm/gsm23003.h +++ b/include/osmocom/gsm/gsm23003.h @@ -105,13 +105,19 @@ bool osmo_msisdn_str_valid(const char *msisdn); bool osmo_imei_str_valid(const char *imei, bool with_15th_digit); const char *osmo_mcc_name(uint16_t mcc); +char *osmo_mcc_name_buf(char *buf, size_t buf_len, uint16_t mcc); const char *osmo_mnc_name(uint16_t mnc, bool mnc_3_digits); +char *osmo_mnc_name_buf(char *buf, size_t buf_len, uint16_t mnc, bool mnc_3_digits); const char *osmo_plmn_name(const struct osmo_plmn_id *plmn); const char *osmo_plmn_name2(const struct osmo_plmn_id *plmn); +char *osmo_plmn_name_buf(char *buf, size_t buf_len, const struct osmo_plmn_id *plmn); const char *osmo_lai_name(const struct osmo_location_area_id *lai); +char *osmo_lai_name_buf(char *buf, size_t buf_len, const struct osmo_location_area_id *lai); const char *osmo_cgi_name(const struct osmo_cell_global_id *cgi); const char *osmo_cgi_name2(const struct osmo_cell_global_id *cgi); +char *osmo_cgi_name_buf(char *buf, size_t buf_len, const struct osmo_cell_global_id *cgi); const char *osmo_gummei_name(const struct osmo_gummei *gummei); +char *osmo_gummei_name_buf(char *buf, size_t buf_len, const struct osmo_gummei *gummei); void osmo_plmn_to_bcd(uint8_t *bcd_dst, const struct osmo_plmn_id *plmn); void osmo_plmn_from_bcd(const uint8_t *bcd_src, struct osmo_plmn_id *plmn); diff --git a/include/osmocom/gsm/gsm48.h b/include/osmocom/gsm/gsm48.h index 7e0e5c48..81b2bf0d 100644 --- a/include/osmocom/gsm/gsm48.h +++ b/include/osmocom/gsm/gsm48.h @@ -35,6 +35,7 @@ const char *gsm48_cc_msg_name(uint8_t msgtype); const char *gsm48_rr_msg_name(uint8_t msgtype); const char *rr_cause_name(uint8_t cause); const char *osmo_rai_name(const struct gprs_ra_id *rai); +char *osmo_rai_name_buf(char *buf, size_t buf_len, const struct gprs_ra_id *rai); int gsm48_decode_lai(struct gsm48_loc_area_id *lai, uint16_t *mcc, uint16_t *mnc, uint16_t *lac) @@ -55,6 +56,7 @@ int gsm48_mi_to_string(char *string, const int str_len, const uint8_t *mi, const int mi_len); const char *gsm48_mi_type_name(uint8_t mi); const char *osmo_mi_name(const uint8_t *mi, uint8_t mi_len); +char *osmo_mi_name_buf(char *buf, size_t buf_len, const uint8_t *mi, uint8_t mi_len); /* Parse Routeing Area Identifier */ void gsm48_parse_ra(struct gprs_ra_id *raid, const uint8_t *buf); diff --git a/include/osmocom/gsm/gsm_utils.h b/include/osmocom/gsm/gsm_utils.h index f8f72a7f..f48cc68f 100644 --- a/include/osmocom/gsm/gsm_utils.h +++ b/include/osmocom/gsm/gsm_utils.h @@ -180,6 +180,7 @@ uint32_t gsm_gsmtime2fn(struct gsm_time *time); /* Returns static buffer with string representation of a GSM Time */ char *osmo_dump_gsmtime(const struct gsm_time *tm); +char *osmo_dump_gsmtime_buf(char *buf, size_t buf_len, const struct gsm_time *tm); /* GSM TS 03.03 Chapter 2.6 */ enum gprs_tlli_type { diff --git a/include/osmocom/gsm/protocol/gsm_04_08.h b/include/osmocom/gsm/protocol/gsm_04_08.h index c052e4c8..c97df168 100644 --- a/include/osmocom/gsm/protocol/gsm_04_08.h +++ b/include/osmocom/gsm/protocol/gsm_04_08.h @@ -70,6 +70,7 @@ bool osmo_gsm48_classmark1_is_r99(const struct gsm48_classmark1 *cm1); bool osmo_gsm48_classmark2_is_r99(const struct gsm48_classmark2 *cm2, uint8_t cm2_len); int osmo_gsm48_classmark_supports_a5(const struct osmo_gsm48_classmark *cm, uint8_t a5); const char *osmo_gsm48_classmark_a5_name(const struct osmo_gsm48_classmark *cm); +char *osmo_gsm48_classmark_a5_name_buf(char *buf, size_t buf_len, const struct osmo_gsm48_classmark *cm); void osmo_gsm48_classmark_update(struct osmo_gsm48_classmark *dst, const struct osmo_gsm48_classmark *src); /* Chapter 10.5.2.1b.3 */ @@ -1643,6 +1644,7 @@ extern const struct value_string gsm48_rr_msgtype_names[]; extern const struct value_string gsm48_mm_msgtype_names[]; extern const struct value_string gsm48_cc_msgtype_names[]; const char *gsm48_pdisc_msgtype_name(uint8_t pdisc, uint8_t msg_type); +char *gsm48_pdisc_msgtype_name_buf(char *buf, size_t buf_len, uint8_t pdisc, uint8_t msg_type); /* FIXME: Table 10.4 / 10.4a (GPRS) */ diff --git a/include/osmocom/gsm/rsl.h b/include/osmocom/gsm/rsl.h index be0fa797..4a1da3a6 100644 --- a/include/osmocom/gsm/rsl.h +++ b/include/osmocom/gsm/rsl.h @@ -30,6 +30,7 @@ uint8_t rsl_enc_chan_nr(uint8_t type, uint8_t subch, uint8_t timeslot); /* decode channel number as per Section 9.3.1 */ int rsl_dec_chan_nr(uint8_t chan_nr, uint8_t *type, uint8_t *subch, uint8_t *timeslot); /* Turns channel number into a string */ +char *rsl_chan_nr_str_buf(char *buf, size_t buf_len, uint8_t chan_nr); const char *rsl_chan_nr_str(uint8_t chan_nr); -- cgit v1.2.3