diff options
author | Antoine Brodin <antoine@FreeBSD.org> | 2008-03-17 19:05:36 +0000 |
---|---|---|
committer | Antoine Brodin <antoine@FreeBSD.org> | 2008-03-17 19:05:36 +0000 |
commit | 7cda691772b07642a2b58c6f86a73bd206bd97ee (patch) | |
tree | 58f7c41d149fab76b28f5e3aaea34a893c7d8249 | |
parent | f6e893d83f4d72755aa332926a796c9597490108 (diff) |
Notes
-rw-r--r-- | lib/libdisk/disk.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/libdisk/disk.c b/lib/libdisk/disk.c index 68be4eee464a..9b0d5fa71484 100644 --- a/lib/libdisk/disk.c +++ b/lib/libdisk/disk.c @@ -189,10 +189,10 @@ char ** Disk_Names() { int disk_cnt; - static char **disks; + char **disks; int error; size_t listsize; - char *disklist; + char *disklist, *disk1, *disk2; error = sysctlbyname("kern.disks", NULL, &listsize, NULL, 0); if (error) { @@ -206,7 +206,7 @@ Disk_Names() disks = malloc(sizeof *disks * (1 + MAX_NO_DISKS)); if (disks == NULL) return NULL; - disklist = (char *)malloc(listsize + 1); + disk1 = disklist = (char *)malloc(listsize + 1); if (disklist == NULL) { free(disks); return NULL; @@ -220,11 +220,20 @@ Disk_Names() return NULL; } for (disk_cnt = 0; disk_cnt < MAX_NO_DISKS; disk_cnt++) { - disks[disk_cnt] = strsep(&disklist, " "); - if (disks[disk_cnt] == NULL) + disk2 = strsep(&disk1, " "); + if (disk2 == NULL) break; + disks[disk_cnt] = strdup(disk2); + if (disks[disk_cnt] == NULL) { + for (disk_cnt--; disk_cnt >= 0; disk_cnt--) + free(disks[disk_cnt]); + free(disklist); + free(disks); + return (NULL); + } } qsort(disks, disk_cnt, sizeof(char*), qstrcmp); + free(disklist); return disks; } |