mirror of
https://github.com/irssi/irssi.git
synced 2024-11-03 04:27:19 -05:00
Fixed memleak when preserving valid charsets in read_settings in fe-recode.c (Bug 210)
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@3718 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
418136656d
commit
49c8ba4058
@ -39,9 +39,9 @@ for ((var) = (head); \
|
|||||||
(var) = g_slist_next((var)))
|
(var) = g_slist_next((var)))
|
||||||
|
|
||||||
#ifdef HAVE_GLIB2
|
#ifdef HAVE_GLIB2
|
||||||
const char *recode_fallback = NULL;
|
char *recode_fallback = NULL;
|
||||||
const char *recode_out_default = NULL;
|
char *recode_out_default = NULL;
|
||||||
const char *term_charset = NULL;
|
char *term_charset = NULL;
|
||||||
|
|
||||||
static const char *fe_recode_get_target (WI_ITEM_REC *witem)
|
static const char *fe_recode_get_target (WI_ITEM_REC *witem)
|
||||||
{
|
{
|
||||||
@ -151,41 +151,51 @@ static void fe_recode_remove_cmd (const char *data, SERVER_REC *server, WI_ITEM_
|
|||||||
|
|
||||||
static void read_settings(void)
|
static void read_settings(void)
|
||||||
{
|
{
|
||||||
const char *old_term_charset = g_strdup (term_charset);
|
/* preserve the valid values */
|
||||||
const char *old_recode_fallback = g_strdup (recode_fallback);
|
const char *old_term_charset = g_strdup(term_charset);
|
||||||
const char *old_recode_out_default = g_strdup (recode_out_default);
|
const char *old_recode_fallback = g_strdup(recode_fallback);
|
||||||
|
const char *old_recode_out_default = g_strdup(recode_out_default);
|
||||||
recode_fallback = settings_get_str("recode_fallback");
|
|
||||||
|
if (recode_fallback)
|
||||||
|
g_free(term_charset);
|
||||||
|
recode_fallback = g_strdup(settings_get_str("recode_fallback"));
|
||||||
if (!is_valid_charset(recode_fallback)) {
|
if (!is_valid_charset(recode_fallback)) {
|
||||||
signal_emit("error command", 2, GINT_TO_POINTER(CMDERR_INVALID_CHARSET), recode_fallback);
|
signal_emit("error command", 2, GINT_TO_POINTER(CMDERR_INVALID_CHARSET), recode_fallback);
|
||||||
settings_set_str("recode_fallback", old_recode_fallback != NULL ? old_recode_fallback : "ISO8859-1");
|
g_free(recode_fallback);
|
||||||
|
recode_fallback = is_valid_charset(old_recode_fallback) ? g_strdup(old_recode_fallback) : "ISO8859-1";
|
||||||
|
settings_set_str("recode_fallback", recode_fallback);
|
||||||
}
|
}
|
||||||
recode_fallback = g_strdup(settings_get_str("recode_fallback"));
|
|
||||||
|
if (term_charset)
|
||||||
term_charset = settings_get_str("term_charset");
|
g_free(term_charset);
|
||||||
|
term_charset = g_strdup(settings_get_str("term_charset"));
|
||||||
if (!is_valid_charset(term_charset)) {
|
if (!is_valid_charset(term_charset)) {
|
||||||
|
g_free(term_charset);
|
||||||
#if defined (HAVE_NL_LANGINFO) && defined(CODESET)
|
#if defined (HAVE_NL_LANGINFO) && defined(CODESET)
|
||||||
settings_set_str("term_charset", is_valid_charset(old_term_charset) ?
|
term_charset = is_valid_charset(old_term_charset) ? g_strdup(old_term_charset) :
|
||||||
old_term_charset : *nl_langinfo(CODESET) != '\0' ?
|
*nl_langinfo(CODESET) != '\0' ? g_strdup(nl_langinfo(CODESET)) :
|
||||||
nl_langinfo(CODESET) : "ISO8859-1");
|
"ISO8859-1";
|
||||||
#else
|
#else
|
||||||
settings_set_str("term_charset", is_valid_charset(old_term_charset) ? old_term_charset : "ISO8859-1");
|
term_charset = is_valid_charset(old_term_charset) ? g_strdup(old_term_charset) : "ISO8859-1";
|
||||||
#endif
|
#endif
|
||||||
|
settings_set_str("term_charset", term_charset);
|
||||||
/* FIXME: move the check of term_charset into fe-text/term.c
|
/* FIXME: move the check of term_charset into fe-text/term.c
|
||||||
it breaks the proper term_input_type
|
it breaks the proper term_input_type
|
||||||
setup and reemitting of the signal is kludgy */
|
setup and reemitting of the signal is kludgy */
|
||||||
if (g_strcasecmp(term_charset, old_term_charset) != 0);
|
if (g_strcasecmp(term_charset, old_term_charset) != 0)
|
||||||
signal_emit("setup changed", 0);
|
signal_emit("setup changed", 0);
|
||||||
}
|
}
|
||||||
term_charset = g_strdup(settings_get_str("term_charset"));
|
|
||||||
|
if (recode_out_default)
|
||||||
recode_out_default = settings_get_str("recode_out_default_charset");
|
g_free(recode_out_default);
|
||||||
if (recode_out_default != NULL && *recode_out_default != '\0')
|
|
||||||
if( !is_valid_charset(recode_out_default)) {
|
|
||||||
signal_emit("error command", 2, GINT_TO_POINTER(CMDERR_INVALID_CHARSET), recode_out_default);
|
|
||||||
settings_set_str("recode_out_default_charset", old_recode_out_default);
|
|
||||||
}
|
|
||||||
recode_out_default = g_strdup(settings_get_str("recode_out_default_charset"));
|
recode_out_default = g_strdup(settings_get_str("recode_out_default_charset"));
|
||||||
|
if (recode_out_default != NULL && *recode_out_default != '\0' &&
|
||||||
|
!is_valid_charset(recode_out_default)) {
|
||||||
|
signal_emit("error command", 2, GINT_TO_POINTER(CMDERR_INVALID_CHARSET), recode_out_default);
|
||||||
|
g_free(recode_out_default);
|
||||||
|
recode_out_default = is_valid_charset(old_recode_out_default) ? g_strdup(old_recode_out_default) : NULL;
|
||||||
|
settings_set_str("recode_out_default_charset", recode_out_default);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void message_own_public(const SERVER_REC *server, const char *msg,
|
static void message_own_public(const SERVER_REC *server, const char *msg,
|
||||||
@ -255,4 +265,3 @@ void fe_recode_deinit (void)
|
|||||||
signal_remove("message irc own_notice", (SIGNAL_FUNC) message_irc_own_notice);
|
signal_remove("message irc own_notice", (SIGNAL_FUNC) message_irc_own_notice);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user