util: Use g_malloc/g_free in envlist.c
Change malloc/strdup/free to g_malloc/g_strdup/g_free in util/envlist.c. Remove NULL checks for pointers returned from g_malloc and g_strdup as they exit in case of failure. Also, update calls to envlist_create to reflect this. Free array and array contents returned by envlist_to_environ using g_free in bsd-user/main.c and linux-user/main.c. Update comments to reflect change in semantics. Signed-off-by: Saurav Sachidanand <sauravsachidanand@gmail.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
9879f5ac62
commit
ec45bbe5f1
@ -744,10 +744,7 @@ int main(int argc, char **argv)
|
|||||||
qemu_init_cpu_list();
|
qemu_init_cpu_list();
|
||||||
module_call_init(MODULE_INIT_QOM);
|
module_call_init(MODULE_INIT_QOM);
|
||||||
|
|
||||||
if ((envlist = envlist_create()) == NULL) {
|
envlist = envlist_create();
|
||||||
(void) fprintf(stderr, "Unable to allocate envlist\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* add current environment into the list */
|
/* add current environment into the list */
|
||||||
for (wrk = environ; *wrk != NULL; wrk++) {
|
for (wrk = environ; *wrk != NULL; wrk++) {
|
||||||
@ -785,10 +782,7 @@ int main(int argc, char **argv)
|
|||||||
usage();
|
usage();
|
||||||
} else if (!strcmp(r, "ignore-environment")) {
|
} else if (!strcmp(r, "ignore-environment")) {
|
||||||
envlist_free(envlist);
|
envlist_free(envlist);
|
||||||
if ((envlist = envlist_create()) == NULL) {
|
envlist = envlist_create();
|
||||||
(void) fprintf(stderr, "Unable to allocate envlist\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else if (!strcmp(r, "U")) {
|
} else if (!strcmp(r, "U")) {
|
||||||
r = argv[optind++];
|
r = argv[optind++];
|
||||||
if (envlist_unsetenv(envlist, r) != 0)
|
if (envlist_unsetenv(envlist, r) != 0)
|
||||||
@ -956,10 +950,10 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (wrk = target_environ; *wrk; wrk++) {
|
for (wrk = target_environ; *wrk; wrk++) {
|
||||||
free(*wrk);
|
g_free(*wrk);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(target_environ);
|
g_free(target_environ);
|
||||||
|
|
||||||
if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
|
if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
|
||||||
qemu_log("guest_base 0x%lx\n", guest_base);
|
qemu_log("guest_base 0x%lx\n", guest_base);
|
||||||
|
@ -4229,10 +4229,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
qemu_init_cpu_list();
|
qemu_init_cpu_list();
|
||||||
module_call_init(MODULE_INIT_QOM);
|
module_call_init(MODULE_INIT_QOM);
|
||||||
|
|
||||||
if ((envlist = envlist_create()) == NULL) {
|
envlist = envlist_create();
|
||||||
(void) fprintf(stderr, "Unable to allocate envlist\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* add current environment into the list */
|
/* add current environment into the list */
|
||||||
for (wrk = environ; *wrk != NULL; wrk++) {
|
for (wrk = environ; *wrk != NULL; wrk++) {
|
||||||
@ -4429,10 +4426,10 @@ int main(int argc, char **argv, char **envp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (wrk = target_environ; *wrk; wrk++) {
|
for (wrk = target_environ; *wrk; wrk++) {
|
||||||
free(*wrk);
|
g_free(*wrk);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(target_environ);
|
g_free(target_environ);
|
||||||
|
|
||||||
if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
|
if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
|
||||||
qemu_log("guest_base 0x%lx\n", guest_base);
|
qemu_log("guest_base 0x%lx\n", guest_base);
|
||||||
|
@ -17,16 +17,14 @@ static int envlist_parse(envlist_t *envlist,
|
|||||||
const char *env, int (*)(envlist_t *, const char *));
|
const char *env, int (*)(envlist_t *, const char *));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocates new envlist and returns pointer to that or
|
* Allocates new envlist and returns pointer to it.
|
||||||
* NULL in case of error.
|
|
||||||
*/
|
*/
|
||||||
envlist_t *
|
envlist_t *
|
||||||
envlist_create(void)
|
envlist_create(void)
|
||||||
{
|
{
|
||||||
envlist_t *envlist;
|
envlist_t *envlist;
|
||||||
|
|
||||||
if ((envlist = malloc(sizeof (*envlist))) == NULL)
|
envlist = g_malloc(sizeof(*envlist));
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
QLIST_INIT(&envlist->el_entries);
|
QLIST_INIT(&envlist->el_entries);
|
||||||
envlist->el_count = 0;
|
envlist->el_count = 0;
|
||||||
@ -48,10 +46,10 @@ envlist_free(envlist_t *envlist)
|
|||||||
entry = envlist->el_entries.lh_first;
|
entry = envlist->el_entries.lh_first;
|
||||||
QLIST_REMOVE(entry, ev_link);
|
QLIST_REMOVE(entry, ev_link);
|
||||||
|
|
||||||
free((char *)entry->ev_var);
|
g_free((char *)entry->ev_var);
|
||||||
free(entry);
|
g_free(entry);
|
||||||
}
|
}
|
||||||
free(envlist);
|
g_free(envlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -101,8 +99,7 @@ envlist_parse(envlist_t *envlist, const char *env,
|
|||||||
if ((envlist == NULL) || (env == NULL))
|
if ((envlist == NULL) || (env == NULL))
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
|
|
||||||
if ((tmpenv = strdup(env)) == NULL)
|
tmpenv = g_strdup(env);
|
||||||
return (errno);
|
|
||||||
envsave = tmpenv;
|
envsave = tmpenv;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -117,7 +114,7 @@ envlist_parse(envlist_t *envlist, const char *env,
|
|||||||
tmpenv = envvar + 1;
|
tmpenv = envvar + 1;
|
||||||
} while (envvar != NULL);
|
} while (envvar != NULL);
|
||||||
|
|
||||||
free(envsave);
|
g_free(envsave);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,18 +152,14 @@ envlist_setenv(envlist_t *envlist, const char *env)
|
|||||||
|
|
||||||
if (entry != NULL) {
|
if (entry != NULL) {
|
||||||
QLIST_REMOVE(entry, ev_link);
|
QLIST_REMOVE(entry, ev_link);
|
||||||
free((char *)entry->ev_var);
|
g_free((char *)entry->ev_var);
|
||||||
free(entry);
|
g_free(entry);
|
||||||
} else {
|
} else {
|
||||||
envlist->el_count++;
|
envlist->el_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((entry = malloc(sizeof (*entry))) == NULL)
|
entry = g_malloc(sizeof(*entry));
|
||||||
return (errno);
|
entry->ev_var = g_strdup(env);
|
||||||
if ((entry->ev_var = strdup(env)) == NULL) {
|
|
||||||
free(entry);
|
|
||||||
return (errno);
|
|
||||||
}
|
|
||||||
QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link);
|
QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
@ -201,8 +194,8 @@ envlist_unsetenv(envlist_t *envlist, const char *env)
|
|||||||
}
|
}
|
||||||
if (entry != NULL) {
|
if (entry != NULL) {
|
||||||
QLIST_REMOVE(entry, ev_link);
|
QLIST_REMOVE(entry, ev_link);
|
||||||
free((char *)entry->ev_var);
|
g_free((char *)entry->ev_var);
|
||||||
free(entry);
|
g_free(entry);
|
||||||
|
|
||||||
envlist->el_count--;
|
envlist->el_count--;
|
||||||
}
|
}
|
||||||
@ -212,12 +205,12 @@ envlist_unsetenv(envlist_t *envlist, const char *env)
|
|||||||
/*
|
/*
|
||||||
* Returns given envlist as array of strings (in same form that
|
* Returns given envlist as array of strings (in same form that
|
||||||
* global variable environ is). Caller must free returned memory
|
* global variable environ is). Caller must free returned memory
|
||||||
* by calling free(3) for each element and for the array. Returned
|
* by calling g_free for each element and the array.
|
||||||
* array and given envlist are not related (no common references).
|
* Returned array and given envlist are not related (no common
|
||||||
|
* references).
|
||||||
*
|
*
|
||||||
* If caller provides count pointer, number of items in array is
|
* If caller provides count pointer, number of items in array is
|
||||||
* stored there. In case of error, NULL is returned and no memory
|
* stored there.
|
||||||
* is allocated.
|
|
||||||
*/
|
*/
|
||||||
char **
|
char **
|
||||||
envlist_to_environ(const envlist_t *envlist, size_t *count)
|
envlist_to_environ(const envlist_t *envlist, size_t *count)
|
||||||
@ -225,13 +218,11 @@ envlist_to_environ(const envlist_t *envlist, size_t *count)
|
|||||||
struct envlist_entry *entry;
|
struct envlist_entry *entry;
|
||||||
char **env, **penv;
|
char **env, **penv;
|
||||||
|
|
||||||
penv = env = malloc((envlist->el_count + 1) * sizeof (char *));
|
penv = env = g_malloc((envlist->el_count + 1) * sizeof(char *));
|
||||||
if (env == NULL)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
for (entry = envlist->el_entries.lh_first; entry != NULL;
|
for (entry = envlist->el_entries.lh_first; entry != NULL;
|
||||||
entry = entry->ev_link.le_next) {
|
entry = entry->ev_link.le_next) {
|
||||||
*(penv++) = strdup(entry->ev_var);
|
*(penv++) = g_strdup(entry->ev_var);
|
||||||
}
|
}
|
||||||
*penv = NULL; /* NULL terminate the list */
|
*penv = NULL; /* NULL terminate the list */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user