summaryrefslogtreecommitdiffstats
path: root/lib/libdisk
diff options
context:
space:
mode:
authorantoine <antoine@FreeBSD.org>2008-02-15 21:19:15 +0000
committerantoine <antoine@FreeBSD.org>2008-02-15 21:19:15 +0000
commit719cf15a1bc65c2d6eb6995fa04bda85088d3c05 (patch)
tree4834cb1fe16ced0d7b6bafbd83e3c80922097d7f /lib/libdisk
parent110048ac4f1c60e393875626b536a82b7f923cf0 (diff)
downloadFreeBSD-src-719cf15a1bc65c2d6eb6995fa04bda85088d3c05.zip
FreeBSD-src-719cf15a1bc65c2d6eb6995fa04bda85088d3c05.tar.gz
- Make Disk_Names() behave as documented in libdisk(3): return an array
of disk names, where you must free each pointer, as well as the array by hand. [1] - Destaticize "disks" in Disk_Names, it has no reasons to be static. PR: kern/96077 [1] PR: kern/114110 [1] MFC after: 1 month Approved by: rwatson (mentor)
Diffstat (limited to 'lib/libdisk')
-rw-r--r--lib/libdisk/disk.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/libdisk/disk.c b/lib/libdisk/disk.c
index 68be4ee..9b0d5fa 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;
}
OpenPOWER on IntegriCloud