mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-18 20:10:29 +01:00
wmmenugen: Fix memory leaks in XDG menu generation when getting locale-dependant name
As reported by Coverity as CID #50142, #50143, #50144 and #50145, all the strings allocated by 'parse_locale' were never freed. Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
This commit is contained in:
committed by
Carlos R. Mafra
parent
2a8fc1df9a
commit
f030ab7664
@@ -479,16 +479,43 @@ static Bool compare_matchlevel(int *current_level, const char *found_locale)
|
|||||||
|
|
||||||
parse_locale(found_locale, &key_lang, &key_ctry, &key_enc, &key_mod);
|
parse_locale(found_locale, &key_lang, &key_ctry, &key_enc, &key_mod);
|
||||||
|
|
||||||
if (env_lang && key_lang && /* Shortcut: if key and env languages don't match, */
|
if (env_lang && key_lang && strcmp(env_lang, key_lang) != 0) {
|
||||||
strcmp(env_lang, key_lang) != 0) /* don't even bother. This takes care of the great */
|
/*
|
||||||
return False; /* majority of the cases without having to go through */
|
* Shortcut: if key and env languages don't match,
|
||||||
/* the more theoretical parts of the spec'd algo. */
|
* don't even bother. This takes care of the great
|
||||||
|
* majority of the cases without having to go through
|
||||||
|
* the more theoretical parts of the spec'd algo.
|
||||||
|
*/
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
if (!env_mod && key_mod) /* If LC_MESSAGES does not have a MODIFIER field, */
|
if (!env_mod && key_mod) {
|
||||||
return False; /* then no key with a modifier will be matched. */
|
/*
|
||||||
|
* If LC_MESSAGES does not have a MODIFIER field,
|
||||||
|
* then no key with a modifier will be matched.
|
||||||
|
*/
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
if (!env_ctry && key_ctry) /* Similarly, if LC_MESSAGES does not have a COUNTRY field, */
|
if (!env_ctry && key_ctry) {
|
||||||
return False; /* then no key with a country specified will be matched. */
|
/*
|
||||||
|
* Similarly, if LC_MESSAGES does not have a COUNTRY field,
|
||||||
|
* then no key with a country specified will be matched.
|
||||||
|
*/
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
/* LC_MESSAGES value: lang_COUNTRY@MODIFIER */
|
/* LC_MESSAGES value: lang_COUNTRY@MODIFIER */
|
||||||
if (env_lang && env_ctry && env_mod) { /* lang_COUNTRY@MODIFIER */
|
if (env_lang && env_ctry && env_mod) { /* lang_COUNTRY@MODIFIER */
|
||||||
@@ -497,25 +524,45 @@ static Bool compare_matchlevel(int *current_level, const char *found_locale)
|
|||||||
strcmp(env_ctry, key_ctry) == 0 &&
|
strcmp(env_ctry, key_ctry) == 0 &&
|
||||||
strcmp(env_mod, key_mod) == 0) {
|
strcmp(env_mod, key_mod) == 0) {
|
||||||
*current_level = MATCH_LANG_COUNTRY_MODIFIER;
|
*current_level = MATCH_LANG_COUNTRY_MODIFIER;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else if (key_lang && key_ctry && /* lang_COUNTRY */
|
} else if (key_lang && key_ctry && /* lang_COUNTRY */
|
||||||
strcmp(env_lang, key_lang) == 0 &&
|
strcmp(env_lang, key_lang) == 0 &&
|
||||||
strcmp(env_ctry, key_ctry) == 0 &&
|
strcmp(env_ctry, key_ctry) == 0 &&
|
||||||
*current_level < MATCH_LANG_COUNTRY) {
|
*current_level < MATCH_LANG_COUNTRY) {
|
||||||
*current_level = MATCH_LANG_COUNTRY;
|
*current_level = MATCH_LANG_COUNTRY;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else if (key_lang && key_mod && /* lang@MODIFIER */
|
} else if (key_lang && key_mod && /* lang@MODIFIER */
|
||||||
strcmp(env_lang, key_lang) == 0 &&
|
strcmp(env_lang, key_lang) == 0 &&
|
||||||
strcmp(env_mod, key_mod) == 0 &&
|
strcmp(env_mod, key_mod) == 0 &&
|
||||||
*current_level < MATCH_LANG_MODIFIER) {
|
*current_level < MATCH_LANG_MODIFIER) {
|
||||||
*current_level = MATCH_LANG_MODIFIER;
|
*current_level = MATCH_LANG_MODIFIER;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else if (key_lang && /* lang */
|
} else if (key_lang && /* lang */
|
||||||
strcmp(env_lang, key_lang) == 0 &&
|
strcmp(env_lang, key_lang) == 0 &&
|
||||||
*current_level < MATCH_LANG) {
|
*current_level < MATCH_LANG) {
|
||||||
*current_level = MATCH_LANG;
|
*current_level = MATCH_LANG;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else {
|
} else {
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -527,13 +574,25 @@ static Bool compare_matchlevel(int *current_level, const char *found_locale)
|
|||||||
strcmp(env_ctry, key_ctry) == 0 &&
|
strcmp(env_ctry, key_ctry) == 0 &&
|
||||||
*current_level < MATCH_LANG_COUNTRY) {
|
*current_level < MATCH_LANG_COUNTRY) {
|
||||||
*current_level = MATCH_LANG_COUNTRY;
|
*current_level = MATCH_LANG_COUNTRY;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else if (key_lang && /* lang */
|
} else if (key_lang && /* lang */
|
||||||
strcmp(env_lang, key_lang) == 0 &&
|
strcmp(env_lang, key_lang) == 0 &&
|
||||||
*current_level < MATCH_LANG) {
|
*current_level < MATCH_LANG) {
|
||||||
*current_level = MATCH_LANG;
|
*current_level = MATCH_LANG;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else {
|
} else {
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -545,13 +604,25 @@ static Bool compare_matchlevel(int *current_level, const char *found_locale)
|
|||||||
strcmp(env_mod, key_mod) == 0 &&
|
strcmp(env_mod, key_mod) == 0 &&
|
||||||
*current_level < MATCH_LANG_MODIFIER) {
|
*current_level < MATCH_LANG_MODIFIER) {
|
||||||
*current_level = MATCH_LANG_MODIFIER;
|
*current_level = MATCH_LANG_MODIFIER;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else if (key_lang && /* lang */
|
} else if (key_lang && /* lang */
|
||||||
strcmp(env_lang, key_lang) == 0 &&
|
strcmp(env_lang, key_lang) == 0 &&
|
||||||
*current_level < MATCH_LANG) {
|
*current_level < MATCH_LANG) {
|
||||||
*current_level = MATCH_LANG;
|
*current_level = MATCH_LANG;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else {
|
} else {
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -562,14 +633,26 @@ static Bool compare_matchlevel(int *current_level, const char *found_locale)
|
|||||||
strcmp(env_lang, key_lang) == 0 &&
|
strcmp(env_lang, key_lang) == 0 &&
|
||||||
*current_level < MATCH_LANG) {
|
*current_level < MATCH_LANG) {
|
||||||
*current_level = MATCH_LANG;
|
*current_level = MATCH_LANG;
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return True;
|
return True;
|
||||||
} else {
|
} else {
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* MATCH_DEFAULT is handled in getLocalizedStringValue */
|
/* MATCH_DEFAULT is handled in getLocalizedStringValue */
|
||||||
|
|
||||||
|
wfree(key_lang);
|
||||||
|
wfree(key_ctry);
|
||||||
|
wfree(key_enc);
|
||||||
|
wfree(key_mod);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user