From: Jaroslav Kysela Date: Fri, 29 Sep 2017 07:31:52 +0000 (+0200) Subject: prop: prop_sbuf / prop_ptr cleanups X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ffb2932c5c8ab7cc3d5fcc7a28960194f4fc938e;p=thirdparty%2Ftvheadend.git prop: prop_sbuf / prop_ptr cleanups The prop get string callbacks should use static buffers. This patch is trying to fix the problematic parts (mostly in dvr_db.c) and also introduces prop_ptr to not allocate static pointer in each string get callback. The problems in dvb_db.c were serious, so tvh could crash or invalid data are written to the config files. Issue: #4636 --- diff --git a/src/access.c b/src/access.c index cedd27a8e..06b791ca9 100644 --- a/src/access.c +++ b/src/access.c @@ -1242,9 +1242,8 @@ access_entry_class_prefix_set(void *o, const void *v) static const void * access_entry_class_prefix_get(void *o) { - static const char *ret; - ret = access_get_prefix(&((access_entry_t *)o)->ae_ipmasks); - return &ret; + prop_ptr = access_get_prefix(&((access_entry_t *)o)->ae_ipmasks); + return &prop_ptr; } static int @@ -2167,9 +2166,8 @@ ipblock_entry_class_prefix_set(void *o, const void *v) static const void * ipblock_entry_class_prefix_get(void *o) { - static const char *ret; - ret = access_get_prefix(&((ipblock_entry_t *)o)->ib_ipmasks); - return &ret; + prop_ptr = access_get_prefix(&((ipblock_entry_t *)o)->ib_ipmasks); + return &prop_ptr; } CLASS_DOC(ipblocking) diff --git a/src/bouquet.c b/src/bouquet.c index 75e70f096..e45dc7b6e 100644 --- a/src/bouquet.c +++ b/src/bouquet.c @@ -878,14 +878,13 @@ bouquet_class_chtag_notify ( void *obj, const char *lang ) static const void * bouquet_class_chtag_ref_get ( void *obj ) { - static const char *buf; bouquet_t *bq = obj; if (bq->bq_chtag_ptr) - buf = idnode_uuid_as_str(&bq->bq_chtag_ptr->ct_id, prop_sbuf); + idnode_uuid_as_str(&bq->bq_chtag_ptr->ct_id, prop_sbuf); else - buf = ""; - return &buf; + prop_sbuf[0] = '\0'; + return &prop_sbuf_ptr; } static char * diff --git a/src/channels.c b/src/channels.c index a8b3a00f0..5d2dc8834 100644 --- a/src/channels.c +++ b/src/channels.c @@ -213,9 +213,8 @@ channel_class_icon_notify ( void *obj, const char *lang ) static const void * channel_class_get_icon ( void *obj ) { - static const char *s; - s = channel_get_icon(obj); - return &s; + prop_ptr = channel_get_icon(obj); + return &prop_ptr; } static const char * @@ -256,9 +255,8 @@ channel_class_set_name ( void *o, const void *p ) static const void * channel_class_get_name ( void *o ) { - static const char *s; - s = channel_get_name(o, channel_blank_name); - return &s; + prop_ptr = channel_get_name(o, channel_blank_name); + return &prop_ptr; } static const void * @@ -1434,9 +1432,8 @@ channel_tag_class_icon_notify ( void *obj, const char *lang ) static const void * channel_tag_class_get_icon ( void *obj ) { - static const char *s; - s = channel_tag_get_icon(obj); - return &s; + prop_ptr = channel_tag_get_icon(obj); + return &prop_ptr; } /* exported for others */ diff --git a/src/descrambler/caclient.c b/src/descrambler/caclient.c index 97bb73b77..edc3210c1 100644 --- a/src/descrambler/caclient.c +++ b/src/descrambler/caclient.c @@ -184,11 +184,11 @@ static const char * caclient_class_get_title ( idnode_t *in, const char *lang ) { caclient_t *cac = (caclient_t *)in; - static char buf[32]; if (cac->cac_name && cac->cac_name[0]) return cac->cac_name; - snprintf(buf, sizeof(buf), tvh_gettext_lang(lang, N_("CA client %i")), cac->cac_index); - return buf; + snprintf(prop_sbuf, PROP_SBUF_LEN, + tvh_gettext_lang(lang, N_("CA client %i")), cac->cac_index); + return prop_sbuf; } static void @@ -242,9 +242,8 @@ static const void * caclient_class_status_get(void *o) { caclient_t *cac = o; - static const char *ret; - ret = caclient_get_status(cac); - return &ret; + prop_ptr = caclient_get_status(cac); + return &prop_ptr; } CLASS_DOC(caclient) diff --git a/src/descrambler/cccam.c b/src/descrambler/cccam.c index 5b96d14da..8bf7e83f0 100644 --- a/src/descrambler/cccam.c +++ b/src/descrambler/cccam.c @@ -1886,9 +1886,7 @@ static const void * caclient_cccam_nodeid_get(void *o) { cccam_t *cccam = o; - static char buf[64]; - static const char *ret = buf; - snprintf(buf, sizeof(buf), + snprintf(prop_sbuf, PROP_SBUF_LEN, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", cccam->cccam_nodeid[0x0], cccam->cccam_nodeid[0x1], @@ -1898,7 +1896,7 @@ caclient_cccam_nodeid_get(void *o) cccam->cccam_nodeid[0x5], cccam->cccam_nodeid[0x6], cccam->cccam_nodeid[0x7]); - return &ret; + return &prop_sbuf_ptr; } diff --git a/src/descrambler/constcw.c b/src/descrambler/constcw.c index 12b593c7f..cd3aefefd 100644 --- a/src/descrambler/constcw.c +++ b/src/descrambler/constcw.c @@ -261,15 +261,13 @@ constcw_class_key_odd_set(void *o, const void *v) static const void * constcw_class_key_get(void *o, const uint8_t *key) { - static char buf[64]; - static const char *ret = buf; if (constcw_key_size(o) == 8) { - snprintf(buf, sizeof(buf), + snprintf(prop_sbuf, PROP_SBUF_LEN, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", key[0x0], key[0x1], key[0x2], key[0x3], key[0x4], key[0x5], key[0x6], key[0x7]); } else { - snprintf(buf, sizeof(buf), + snprintf(prop_sbuf, PROP_SBUF_LEN, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:" "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", key[0x0], key[0x1], key[0x2], key[0x3], @@ -277,7 +275,7 @@ constcw_class_key_get(void *o, const uint8_t *key) key[0x8], key[0x9], key[0xa], key[0xb], key[0xc], key[0xd], key[0xe], key[0xf]); } - return &ret; + return &prop_sbuf_ptr; } static const void * diff --git a/src/descrambler/cwc.c b/src/descrambler/cwc.c index 26af144d5..826be5961 100644 --- a/src/descrambler/cwc.c +++ b/src/descrambler/cwc.c @@ -1812,9 +1812,7 @@ static const void * caclient_cwc_class_deskey_get(void *o) { cwc_t *cwc = o; - static char buf[64]; - static const char *ret = buf; - snprintf(buf, sizeof(buf), + snprintf(prop_sbuf, PROP_SBUF_LEN, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:" "%02x:%02x:%02x:%02x:%02x:%02x:%02x", cwc->cwc_confedkey[0x0], @@ -1831,7 +1829,7 @@ caclient_cwc_class_deskey_get(void *o) cwc->cwc_confedkey[0xb], cwc->cwc_confedkey[0xc], cwc->cwc_confedkey[0xd]); - return &ret; + return &prop_sbuf_ptr; } const idclass_t caclient_cwc_class = diff --git a/src/dvr/dvr_autorec.c b/src/dvr/dvr_autorec.c index 723d70de6..1eb628d1e 100644 --- a/src/dvr/dvr_autorec.c +++ b/src/dvr/dvr_autorec.c @@ -632,14 +632,11 @@ dvr_autorec_entry_class_start_window_set(void *o, const void *v) static const void * dvr_autorec_entry_class_time_get(void *o, int tm) { - static const char *ret; - static char buf[16]; if (tm >= 0) - snprintf(buf, sizeof(buf), "%02d:%02d", tm / 60, tm % 60); + snprintf(prop_sbuf, PROP_SBUF_LEN, "%02d:%02d", tm / 60, tm % 60); else - strncpy(buf, N_("Any"), 16); - ret = buf; - return &ret; + strncpy(prop_sbuf, N_("Any"), 16); + return &prop_sbuf_ptr; } static const void * @@ -852,13 +849,11 @@ dvr_autorec_entry_class_brand_set(void *o, const void *v) static const void * dvr_autorec_entry_class_brand_get(void *o) { - static const char *ret; dvr_autorec_entry_t *dae = (dvr_autorec_entry_t *)o; - if (dae->dae_brand) - ret = dae->dae_brand->uri; - else - ret = ""; - return &ret; + prop_ptr = dae->dae_brand ? dae->dae_brand->uri : NULL; + if (prop_ptr == NULL) + prop_ptr = ""; + return &prop_ptr; } static int @@ -888,13 +883,11 @@ dvr_autorec_entry_class_season_set(void *o, const void *v) static const void * dvr_autorec_entry_class_season_get(void *o) { - static const char *ret; dvr_autorec_entry_t *dae = (dvr_autorec_entry_t *)o; - if (dae->dae_season) - ret = dae->dae_season->uri; - else - ret = ""; - return &ret; + prop_ptr = dae->dae_season ? dae->dae_season->uri : NULL; + if (prop_ptr == NULL) + prop_ptr = ""; + return &prop_ptr; } static int @@ -924,13 +917,11 @@ dvr_autorec_entry_class_series_link_set(void *o, const void *v) static const void * dvr_autorec_entry_class_series_link_get(void *o) { - static const char *ret; dvr_autorec_entry_t *dae = (dvr_autorec_entry_t *)o; - if (dae->dae_serieslink) - ret = dae->dae_serieslink->uri; - else - ret = ""; - return &ret; + prop_ptr = dae->dae_serieslink ? dae->dae_serieslink->uri : NULL; + if (prop_ptr == NULL) + prop_ptr = ""; + return &prop_ptr; } static htsmsg_t * diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 012da9fd2..fb25c6cd4 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -2599,11 +2599,9 @@ dvr_entry_class_config_name_rend(void *o, const char *lang) static const void * dvr_entry_class_filename_get(void *o) { - static const char *ret; dvr_entry_t *de = (dvr_entry_t *)o; - const char *s = dvr_get_filename(de); - ret = s ?: ""; - return &ret; + prop_ptr = dvr_get_filename(de) ?: ""; + return &prop_ptr; } static int @@ -2681,13 +2679,12 @@ dvr_entry_class_channel_name_set(void *o, const void *v) static const void * dvr_entry_class_channel_name_get(void *o) { - static const char *ret; dvr_entry_t *de = (dvr_entry_t *)o; if (de->de_channel) - ret = channel_get_name(de->de_channel, channel_blank_name); + prop_ptr = channel_get_name(de->de_channel, channel_blank_name); else - ret = de->de_channel_name; - return &ret; + prop_ptr = de->de_channel_name; + return &prop_ptr; } static int @@ -2798,19 +2795,17 @@ dvr_entry_class_autorec_get(void *o) static const void * dvr_entry_class_autorec_caption_get(void *o) { - static const char *ret; dvr_entry_t *de = (dvr_entry_t *)o; dvr_autorec_entry_t *dae = de->de_autorec; if (dae) { - ret = prop_sbuf; snprintf(prop_sbuf, PROP_SBUF_LEN, "%s%s%s%s", dae->dae_name ?: "", dae->dae_comment ? " (" : "", dae->dae_comment, dae->dae_comment ? ")" : ""); } else - ret = ""; - return &ret; + prop_sbuf[0] = '\0'; + return &prop_sbuf_ptr; } static int @@ -2838,32 +2833,28 @@ dvr_entry_class_timerec_set(void *o, const void *v) static const void * dvr_entry_class_timerec_get(void *o) { - static const char *ret; - char ubuf[UUID_HEX_SIZE]; dvr_entry_t *de = (dvr_entry_t *)o; if (de->de_timerec) - ret = idnode_uuid_as_str(&de->de_timerec->dte_id, ubuf); + idnode_uuid_as_str(&de->de_timerec->dte_id, prop_sbuf); else - ret = ""; - return &ret; + prop_sbuf[0] = '\0'; + return &prop_sbuf_ptr; } static const void * dvr_entry_class_timerec_caption_get(void *o) { - static const char *ret; dvr_entry_t *de = (dvr_entry_t *)o; dvr_timerec_entry_t *dte = de->de_timerec; if (dte) { - ret = prop_sbuf; snprintf(prop_sbuf, PROP_SBUF_LEN, "%s%s%s%s", dte->dte_name ?: "", dte->dte_comment ? " (" : "", dte->dte_comment, dte->dte_comment ? ")" : ""); } else - ret = ""; - return &ret; + prop_sbuf[0] = '\0'; + return &prop_sbuf_ptr; } static int @@ -2879,14 +2870,12 @@ dvr_entry_class_parent_set(void *o, const void *v) static const void * dvr_entry_class_parent_get(void *o) { - static const char *ret; - char ubuf[UUID_HEX_SIZE]; dvr_entry_t *de = (dvr_entry_t *)o; if (de->de_parent) - ret = idnode_uuid_as_str(&de->de_parent->de_id, ubuf); + idnode_uuid_as_str(&de->de_parent->de_id, prop_sbuf); else - ret = ""; - return &ret; + prop_sbuf[0] = '\0'; + return &prop_sbuf_ptr; } static int @@ -2902,14 +2891,12 @@ dvr_entry_class_child_set(void *o, const void *v) static const void * dvr_entry_class_child_get(void *o) { - static const char *ret; - char ubuf[UUID_HEX_SIZE]; dvr_entry_t *de = (dvr_entry_t *)o; if (de->de_child) - ret = idnode_uuid_as_str(&de->de_child->de_id, ubuf); + idnode_uuid_as_str(&de->de_child->de_id, prop_sbuf); else - ret = ""; - return &ret; + prop_sbuf[0] = '\0'; + return &prop_sbuf_ptr; } static int @@ -2957,14 +2944,13 @@ static const void * dvr_entry_class_disp_title_get(void *o) { dvr_entry_t *de = (dvr_entry_t *)o; - static const char *s; - s = ""; - if (de->de_title) { - s = lang_str_get(de->de_title, idnode_lang(o)); - if (s == NULL) - s = ""; - } - return &s; + if (de->de_title) + prop_ptr = lang_str_get(de->de_title, idnode_lang(o)); + else + prop_ptr = NULL; + if (prop_ptr == NULL) + prop_ptr = ""; + return &prop_ptr; } static int @@ -2988,28 +2974,26 @@ static const void * dvr_entry_class_disp_subtitle_get(void *o) { dvr_entry_t *de = (dvr_entry_t *)o; - static const char *s; - s = ""; - if (de->de_subtitle) { - s = lang_str_get(de->de_subtitle, idnode_lang(o)); - if (s == NULL) - s = ""; - } - return &s; + if (de->de_subtitle) + prop_ptr = lang_str_get(de->de_subtitle, idnode_lang(o)); + else + prop_ptr = NULL; + if (prop_ptr == NULL) + prop_ptr = ""; + return &prop_ptr; } static const void * dvr_entry_class_disp_description_get(void *o) { dvr_entry_t *de = (dvr_entry_t *)o; - static const char *s; - s = ""; - if (de->de_desc) { - s = lang_str_get(de->de_desc, idnode_lang(o)); - if (s == NULL) - s = ""; - } - return &s; + if (de->de_desc) + prop_ptr = lang_str_get(de->de_desc, idnode_lang(o)); + else + prop_ptr = NULL; + if (prop_ptr == NULL) + prop_ptr = ""; + return &prop_ptr; } static const void * @@ -3076,24 +3060,18 @@ static const void * dvr_entry_class_status_get(void *o) { dvr_entry_t *de = (dvr_entry_t *)o; - static const char *s; - static char buf[100]; - strncpy(buf, dvr_entry_status(de), sizeof(buf)); - buf[sizeof(buf)-1] = '\0'; - s = buf; - return &s; + strncpy(prop_sbuf, dvr_entry_status(de), PROP_SBUF_LEN); + prop_sbuf[PROP_SBUF_LEN-1] = '\0'; + return &prop_sbuf_ptr; } static const void * dvr_entry_class_sched_status_get(void *o) { dvr_entry_t *de = (dvr_entry_t *)o; - static const char *s; - static char buf[100]; - strncpy(buf, dvr_entry_schedstatus(de), sizeof(buf)); - buf[sizeof(buf)-1] = '\0'; - s = buf; - return &s; + strncpy(prop_sbuf, dvr_entry_schedstatus(de), PROP_SBUF_LEN); + prop_sbuf[PROP_SBUF_LEN-1] = '\0'; + return &prop_sbuf_ptr; } static const void * @@ -3101,13 +3079,14 @@ dvr_entry_class_channel_icon_url_get(void *o) { dvr_entry_t *de = (dvr_entry_t *)o; channel_t *ch = de->de_channel; - static const char *s; if (ch == NULL) { - s = ""; - } else if ((s = channel_get_icon(ch)) == NULL) { - s = ""; + prop_ptr = NULL; + } else { + prop_ptr = channel_get_icon(ch); } - return &s; + if (prop_ptr == NULL) + prop_ptr = ""; + return &prop_ptr; } static const void * diff --git a/src/dvr/dvr_timerec.c b/src/dvr/dvr_timerec.c index b3019ce6e..ae1ca6836 100644 --- a/src/dvr/dvr_timerec.c +++ b/src/dvr/dvr_timerec.c @@ -88,14 +88,13 @@ dvr_timerec_purge_spawn(dvr_timerec_entry_t *dte, int delconf) static const char * dvr_timerec_title(dvr_timerec_entry_t *dte, struct tm *start) { - static char buf[256]; size_t len; if (dte->dte_title == NULL) return _("Unknown"); - len = strftime(buf, sizeof(buf) - 1, dte->dte_title, start); - buf[len] = '\0'; - return buf; + len = strftime(prop_sbuf, PROP_SBUF_LEN-1, dte->dte_title, start); + prop_sbuf[len] = '\0'; + return prop_sbuf; } /** @@ -401,14 +400,11 @@ dvr_timerec_entry_class_stop_set(void *o, const void *v) static const void * dvr_timerec_entry_class_time_get(void *o, int tm) { - static const char *ret; - static char buf[16]; if (tm >= 0) - snprintf(buf, sizeof(buf), "%02d:%02d", tm / 60, tm % 60); + snprintf(prop_sbuf, PROP_SBUF_LEN, "%02d:%02d", tm / 60, tm % 60); else - strncpy(buf, N_("Any"), 16); - ret = buf; - return &ret; + strncpy(prop_sbuf, N_("Any"), 16); + return &prop_sbuf_ptr; } static const void * diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index f0e9207f0..1ad2e05a7 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -281,13 +281,12 @@ linuxdvb_frontend_dvbs_class_satconf_set ( void *self, const void *str ) static const void * linuxdvb_frontend_dvbs_class_satconf_get ( void *self ) { - static const char *s; linuxdvb_frontend_t *lfe = self; if (lfe->lfe_satconf) - s = lfe->lfe_satconf->ls_type; + prop_ptr = lfe->lfe_satconf->ls_type; else - s = NULL; - return &s; + prop_ptr = NULL; + return &prop_ptr; } static htsmsg_t * diff --git a/src/input/mpegts/linuxdvb/linuxdvb_satconf.c b/src/input/mpegts/linuxdvb/linuxdvb_satconf.c index 817d29977..75944c3ec 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_satconf.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_satconf.c @@ -1355,10 +1355,9 @@ linuxdvb_satconf_ele_class_lnbtype_set ( void *o, const void *p ) static const void * linuxdvb_satconf_ele_class_lnbtype_get ( void *o ) { - static const char *s; linuxdvb_satconf_ele_t *ls = o; - s = ls->lse_lnb ? ls->lse_lnb->ld_type : NULL; - return &s; + prop_ptr = ls->lse_lnb ? ls->lse_lnb->ld_type : NULL; + return &prop_ptr; } static int @@ -1375,10 +1374,9 @@ linuxdvb_satconf_ele_class_en50494type_set ( void *o, const void *p ) static const void * linuxdvb_satconf_ele_class_en50494type_get ( void *o ) { - static const char *s; linuxdvb_satconf_ele_t *ls = o; - s = ls->lse_en50494 ? ls->lse_en50494->ld_type : NULL; - return &s; + prop_ptr = ls->lse_en50494 ? ls->lse_en50494->ld_type : NULL; + return &prop_ptr; } static int @@ -1396,10 +1394,9 @@ linuxdvb_satconf_ele_class_switchtype_set ( void *o, const void *p ) static const void * linuxdvb_satconf_ele_class_switchtype_get ( void *o ) { - static const char *s; linuxdvb_satconf_ele_t *ls = o; - s = ls->lse_switch ? ls->lse_switch->ld_type : NULL; - return &s; + prop_ptr = ls->lse_switch ? ls->lse_switch->ld_type : NULL; + return &prop_ptr; } static int @@ -1417,10 +1414,9 @@ linuxdvb_satconf_ele_class_rotortype_set ( void *o, const void *p ) static const void * linuxdvb_satconf_ele_class_rotortype_get ( void *o ) { - static const char *s; linuxdvb_satconf_ele_t *ls = o; - s = ls->lse_rotor ? ls->lse_rotor->ld_type : NULL; - return &s; + prop_ptr = ls->lse_rotor ? ls->lse_rotor->ld_type : NULL; + return &prop_ptr; } static const char * diff --git a/src/input/mpegts/mpegts_mux_dvb.c b/src/input/mpegts/mpegts_mux_dvb.c index ebeb9e2e2..9156f3722 100644 --- a/src/input/mpegts/mpegts_mux_dvb.c +++ b/src/input/mpegts/mpegts_mux_dvb.c @@ -49,10 +49,9 @@ extern const idclass_t mpegts_mux_class; static const void * \ dvb_mux_##c##_class_##l##_get (void *o)\ {\ - static const char *s;\ dvb_mux_t *lm = o;\ - s = dvb_##t##2str(lm->lm_tuning.dmc_fe_##f);\ - return &s;\ + prop_ptr = dvb_##t##2str(lm->lm_tuning.dmc_fe_##f);\ + return &prop_ptr;\ }\ static int \ dvb_mux_##c##_class_##l##_set (void *o, const void *v)\ @@ -77,10 +76,9 @@ dvb_mux_##c##_class_##l##_enum (void *o, const char *lang)\ static const void * \ dvb_mux_##c##_class_##l##_get (void *o)\ {\ - static const char *s;\ dvb_mux_t *lm = o;\ - s = dvb_##t##2str(lm->lm_tuning.u.dmc_fe_##f.p);\ - return &s;\ + prop_ptr = dvb_##t##2str(lm->lm_tuning.u.dmc_fe_##f.p);\ + return &prop_ptr;\ }\ static int \ dvb_mux_##c##_class_##l##_set (void *o, const void *v)\ @@ -113,10 +111,9 @@ dvb_mux_##c##_class_##l##_enum (void *o, const char *lang)\ static const void * dvb_mux_class_delsys_get (void *o) { - static const char *s; dvb_mux_t *lm = o; - s = dvb_delsys2str(lm->lm_tuning.dmc_fe_delsys); - return &s; + prop_ptr = dvb_delsys2str(lm->lm_tuning.dmc_fe_delsys); + return &prop_ptr; } static int diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index 549331888..745995644 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -57,8 +57,8 @@ dvb_network_class_delete ( idnode_t *in ) static const void * dvb_network_class_scanfile_get ( void *o ) { - static const char *s = NULL; - return &s; + prop_ptr = NULL; + return &prop_ptr; } void @@ -180,15 +180,10 @@ static const void * dvb_network_class_orbital_pos_get ( void *o ) { dvb_network_t *ln = o; - static char buf[16]; - static const char *s; - s = NULL; - if (ln->mn_satpos != INT_MAX) { - dvb_sat_position_to_str(ln->mn_satpos, buf, sizeof(buf)); - s = buf; - } else - s = ""; - return &s; + prop_sbuf[0] = '\0'; + if (ln->mn_satpos != INT_MAX) + dvb_sat_position_to_str(ln->mn_satpos, prop_sbuf, PROP_SBUF_LEN); + return &prop_sbuf_ptr; } static int diff --git a/src/prop.c b/src/prop.c index afee4fa00..08ec07271 100644 --- a/src/prop.c +++ b/src/prop.c @@ -26,7 +26,8 @@ #include "lang_str.h" char prop_sbuf[PROP_SBUF_LEN]; -char *prop_sbuf_ptr = prop_sbuf; +const char *prop_sbuf_ptr = prop_sbuf; +const char *prop_ptr; /* ************************************************************************** * Utilities diff --git a/src/prop.h b/src/prop.h index d27752b3e..922d1c7b1 100644 --- a/src/prop.h +++ b/src/prop.h @@ -128,7 +128,8 @@ typedef struct property { #define PROP_SBUF_LEN 4096 extern char prop_sbuf[PROP_SBUF_LEN]; -extern char *prop_sbuf_ptr; +extern const char *prop_sbuf_ptr; +extern const char *prop_ptr; const property_t *prop_find(const property_t *p, const char *name);