summaryrefslogtreecommitdiff
path: root/diskman
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-02-12 10:54:27 -0600
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-02-12 10:54:27 -0600
commit0e8c19b115797ff934e84c105ef4357a899bc973 (patch)
treeb3645d8bd16c47ab9281b566135472236d6de336 /diskman
parentd72ef990a3a417e4f9062517313afe325e7035e6 (diff)
downloadhorizon-0e8c19b115797ff934e84c105ef4357a899bc973.tar.gz
horizon-0e8c19b115797ff934e84c105ef4357a899bc973.tar.bz2
horizon-0e8c19b115797ff934e84c105ef4357a899bc973.tar.xz
horizon-0e8c19b115797ff934e84c105ef4357a899bc973.zip
DiskMan: Fix all memory leaks
Diffstat (limited to 'diskman')
-rw-r--r--diskman/disk.cc14
-rw-r--r--diskman/diskman.cc9
-rw-r--r--diskman/partition.cc17
3 files changed, 28 insertions, 12 deletions
diff --git a/diskman/disk.cc b/diskman/disk.cc
index 8006052..329edaa 100644
--- a/diskman/disk.cc
+++ b/diskman/disk.cc
@@ -111,6 +111,7 @@ Disk::Disk(void *creation, int type, bool partition) {
fdisk_table_get_partition(parts, next);
_partitions.push_back(Partition(*this, part, 0));
}
+ fdisk_unref_table(parts);
}
} else if(type == 0) {
/* fallback to udev, if available */
@@ -120,8 +121,7 @@ Disk::Disk(void *creation, int type, bool partition) {
struct udev *udev = udev_device_get_udev(device);
struct udev_enumerate *part_enum = udev_enumerate_new(udev);
if(part_enum != NULL) {
- struct udev_list_entry *first, *item;
- struct udev_device *part_device = NULL;
+ struct udev_list_entry *first;
udev_enumerate_add_match_subsystem(part_enum, "block");
udev_enumerate_add_match_property(part_enum, "DEVTYPE",
@@ -131,13 +131,17 @@ Disk::Disk(void *creation, int type, bool partition) {
first = udev_enumerate_get_list_entry(part_enum);
if(first != NULL) {
+ struct udev_list_entry *item;
udev_list_entry_foreach(item, first) {
const char *path = udev_list_entry_get_name(item);
- if(part_device != NULL) udev_device_unref(part_device);
- part_device = udev_device_new_from_syspath(udev, path);
- _partitions.push_back(Partition(*this, part_device, 1));
+ struct udev_device *part_device = udev_device_new_from_syspath(udev, path);
+ if(part_device != nullptr) {
+ _partitions.push_back(Partition(*this, part_device, 1));
+ udev_device_unref(part_device);
+ }
}
}
+ udev_enumerate_unref(part_enum);
}
} else {
std::cerr << "Cannot load partitions for " << _name << std::endl;
diff --git a/diskman/diskman.cc b/diskman/diskman.cc
index a7d4a26..ee04911 100644
--- a/diskman/diskman.cc
+++ b/diskman/diskman.cc
@@ -52,14 +52,14 @@ std::vector<Disk> DiskMan::find_disks(bool include_part, bool include_vg,
udev_enumerate_add_match_property(disk_enum, "DEVTYPE", "disk");
udev_enumerate_scan_devices(disk_enum);
first = udev_enumerate_get_list_entry(disk_enum);
- if(first == NULL) {
+ if(first == nullptr) {
std::cerr << "No block devices found" << std::endl;
return {};
}
udev_list_entry_foreach(item, first) {
const char *path = udev_list_entry_get_name(item);
- if(device != NULL) udev_device_unref(device);
+ if(device != nullptr) udev_device_unref(device);
device = udev_device_new_from_syspath(pImpl->udev, path);
std::string name(udev_device_get_sysname(device));
if(name.compare(0, 4, "loop") == 0
@@ -78,6 +78,11 @@ std::vector<Disk> DiskMan::find_disks(bool include_part, bool include_vg,
disks.push_back(Disk(device, 0, include_part));
}
+ if(device != nullptr) {
+ udev_device_unref(device);
+ }
+ udev_enumerate_unref(disk_enum);
+
return disks;
}
diff --git a/diskman/partition.cc b/diskman/partition.cc
index 308d002..ba94258 100644
--- a/diskman/partition.cc
+++ b/diskman/partition.cc
@@ -32,13 +32,20 @@ Partition::Partition(Disk &d, void *creation, int type) {
} else {
this->_size = 0;
}
- const char *name = fdisk_partname(d.node().c_str(),
- fdisk_partition_get_partno(part) + 1);
- const char *value;
+ char *name = fdisk_partname(d.node().c_str(),
+ fdisk_partition_get_partno(part) + 1);
+ char *value;
value = blkid_get_tag_value(nullptr, "TYPE", name);
- if(value != nullptr) this->_fs_type = std::string(value);
+ if(value != nullptr) {
+ this->_fs_type = std::string(value);
+ free(value);
+ }
value = blkid_get_tag_value(nullptr, "LABEL", name);
- if(value != nullptr) this->_label = std::string(value);
+ if(value != nullptr) {
+ this->_label = std::string(value);
+ free(value);
+ }
+ free(name);
break;
}
case 1: { /* udev */