fix memory bugs
This commit is contained in:
parent
90b220dba9
commit
7837faa340
1 changed files with 32 additions and 20 deletions
|
@ -278,27 +278,32 @@ gboolean prop_get_string_locale(Window win, Atom prop, char **ret)
|
||||||
|
|
||||||
gboolean prop_get_strings_locale(Window win, Atom prop, char ***ret)
|
gboolean prop_get_strings_locale(Window win, Atom prop, char ***ret)
|
||||||
{
|
{
|
||||||
|
GSList *strs = NULL, *it;
|
||||||
char *raw, *p;
|
char *raw, *p;
|
||||||
guint num, i;
|
guint num, i, count = 0;
|
||||||
|
|
||||||
if (get_all(win, prop, prop_atoms.string, 8, (guchar**)&raw, &num)){
|
if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) {
|
||||||
*ret = g_new(char*, num + 1);
|
|
||||||
(*ret)[num] = NULL; /* null terminated list */
|
|
||||||
|
|
||||||
p = raw;
|
p = raw;
|
||||||
for (i = 0; i < num; ++i) {
|
while (p < raw + num - 1) {
|
||||||
(*ret)[i] = g_convert(p, strlen(p), "UTF-8", "ISO-8859-1",
|
++count;
|
||||||
|
strs = g_slist_append(strs, p);
|
||||||
|
p += strlen(p) + 1; /* next string */
|
||||||
|
}
|
||||||
|
|
||||||
|
*ret = g_new0(char*, count + 1);
|
||||||
|
(*ret)[count] = NULL; /* null terminated list */
|
||||||
|
|
||||||
|
for (it = strs; it; it = g_slist_next(it)) {
|
||||||
|
(*ret)[i] = g_convert(it->data, -1, "UTF-8", "ISO-8859-1",
|
||||||
NULL, NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
/* make sure translation did not fail */
|
/* make sure translation did not fail */
|
||||||
if (!(*ret)[i]) {
|
if (!(*ret)[i])
|
||||||
g_strfreev(*ret); /* free what we did so far */
|
(*ret)[i] = g_strdup("");
|
||||||
break; /* the force is not strong with us */
|
|
||||||
}
|
|
||||||
p += strlen(p) + 1;
|
|
||||||
}
|
}
|
||||||
g_free(raw);
|
g_free(raw);
|
||||||
if (i == num)
|
g_slist_free(strs);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -323,22 +328,29 @@ gboolean prop_get_string_utf8(Window win, Atom prop, char **ret)
|
||||||
|
|
||||||
gboolean prop_get_strings_utf8(Window win, Atom prop, char ***ret)
|
gboolean prop_get_strings_utf8(Window win, Atom prop, char ***ret)
|
||||||
{
|
{
|
||||||
|
GSList *strs = NULL, *it;
|
||||||
char *raw, *p;
|
char *raw, *p;
|
||||||
guint num, i;
|
guint num, i, count = 0;
|
||||||
|
|
||||||
if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) {
|
if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) {
|
||||||
*ret = g_new(char*, num + 1);
|
|
||||||
(*ret)[num] = NULL; /* null terminated list */
|
|
||||||
|
|
||||||
p = raw;
|
p = raw;
|
||||||
for (i = 0; i < num; ++i) {
|
while (p < raw + num - 1) {
|
||||||
if (g_utf8_validate(p, -1, NULL))
|
++count;
|
||||||
(*ret)[i] = g_strdup(p);
|
strs = g_slist_append(strs, p);
|
||||||
|
p += strlen(p) + 1; /* next string */
|
||||||
|
}
|
||||||
|
|
||||||
|
*ret = g_new0(char*, count + 1);
|
||||||
|
|
||||||
|
for (it = strs; it; it = g_slist_next(it)) {
|
||||||
|
if (g_utf8_validate(it->data, -1, NULL))
|
||||||
|
(*ret)[i] = g_strdup(it->data);
|
||||||
else
|
else
|
||||||
(*ret)[i] = g_strdup("");
|
(*ret)[i] = g_strdup("");
|
||||||
p += strlen(p) + 1;
|
|
||||||
}
|
}
|
||||||
g_free(raw);
|
g_free(raw);
|
||||||
|
g_slist_free(strs);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Reference in a new issue