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:
Saurav Sachidanand 2017-03-20 17:38:28 +00:00 committed by Michael Tokarev
parent 9879f5ac62
commit ec45bbe5f1
3 changed files with 26 additions and 44 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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 */