diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index d7d93c4da..887229d9a 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -3499,16 +3499,8 @@ zpool_do_import(int argc, char **argv) cachefile = optarg; break; case 'd': - if (searchdirs == NULL) { - searchdirs = safe_malloc(sizeof (char *)); - } else { - char **tmp = safe_malloc((nsearch + 1) * - sizeof (char *)); - bcopy(searchdirs, tmp, nsearch * - sizeof (char *)); - free(searchdirs); - searchdirs = tmp; - } + searchdirs = safe_realloc(searchdirs, + (nsearch + 1) * sizeof (char *)); searchdirs[nsearch++] = optarg; break; case 'D': @@ -3698,24 +3690,16 @@ zpool_do_import(int argc, char **argv) * Check the environment for the preferred search path. */ if ((searchdirs == NULL) && (env = getenv("ZPOOL_IMPORT_PATH"))) { - char *dir; + char *dir, *tmp = NULL; envdup = strdup(env); - dir = strtok(envdup, ":"); - while (dir != NULL) { - if (searchdirs == NULL) { - searchdirs = safe_malloc(sizeof (char *)); - } else { - char **tmp = safe_malloc((nsearch + 1) * - sizeof (char *)); - bcopy(searchdirs, tmp, nsearch * - sizeof (char *)); - free(searchdirs); - searchdirs = tmp; - } + for (dir = strtok_r(envdup, ":", &tmp); + dir != NULL; + dir = strtok_r(NULL, ":", &tmp)) { + searchdirs = safe_realloc(searchdirs, + (nsearch + 1) * sizeof (char *)); searchdirs[nsearch++] = dir; - dir = strtok(NULL, ":"); } } @@ -3754,10 +3738,8 @@ zpool_do_import(int argc, char **argv) } if (err == 1) { - if (searchdirs != NULL) - free(searchdirs); - if (envdup != NULL) - free(envdup); + free(searchdirs); + free(envdup); nvlist_free(policy); nvlist_free(pools); nvlist_free(props); @@ -3795,10 +3777,8 @@ error: nvlist_free(props); nvlist_free(pools); nvlist_free(policy); - if (searchdirs != NULL) - free(searchdirs); - if (envdup != NULL) - free(envdup); + free(searchdirs); + free(envdup); return (err ? 1 : 0); } diff --git a/cmd/zpool/zpool_util.c b/cmd/zpool/zpool_util.c index 1c1eb024f..1c64c83d8 100644 --- a/cmd/zpool/zpool_util.c +++ b/cmd/zpool/zpool_util.c @@ -49,6 +49,22 @@ safe_malloc(size_t size) return (data); } +/* + * Utility function to guarantee realloc() success. + */ +void * +safe_realloc(void *from, size_t size) +{ + void *data; + + if ((data = realloc(from, size)) == NULL) { + (void) fprintf(stderr, "internal error: out of memory\n"); + exit(1); + } + + return (data); +} + /* * Display an out of memory error message and abort the current program. */ diff --git a/cmd/zpool/zpool_util.h b/cmd/zpool/zpool_util.h index abaa22d78..5557859ed 100644 --- a/cmd/zpool/zpool_util.h +++ b/cmd/zpool/zpool_util.h @@ -39,6 +39,7 @@ extern "C" { * Basic utility functions */ void *safe_malloc(size_t); +void *safe_realloc(void *, size_t); void zpool_no_memory(void); uint_t num_logs(nvlist_t *nv); uint64_t array64_max(uint64_t array[], unsigned int len);