diff --git a/src/lib/blockdev.c.in b/src/lib/blockdev.c.in index 967dca065..6a46392b4 100644 --- a/src/lib/blockdev.c.in +++ b/src/lib/blockdev.c.in @@ -297,9 +297,7 @@ static gboolean load_plugins (BDPluginSpec **require_plugins, gboolean reload, g gboolean requested_loaded = TRUE; GError *error = NULL; GSequence *config_files = NULL; - GSList *plugins_sonames[BD_PLUGIN_UNDEF] = {NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL}; + GSList *plugins_sonames[BD_PLUGIN_UNDEF] = {0}; BDPlugin plugin_name = BD_PLUGIN_UNDEF; guint64 required_plugins_mask = 0; diff --git a/src/plugins/crypto.c b/src/plugins/crypto.c index 0968d5090..84ddd0de5 100644 --- a/src/plugins/crypto.c +++ b/src/plugins/crypto.c @@ -381,10 +381,10 @@ gboolean bd_crypto_is_tech_avail (BDCryptoTech tech, guint64 mode, GError **erro case BD_CRYPTO_TECH_LUKS: ret = mode & (BD_CRYPTO_TECH_MODE_CREATE|BD_CRYPTO_TECH_MODE_OPEN_CLOSE|BD_CRYPTO_TECH_MODE_QUERY| BD_CRYPTO_TECH_MODE_ADD_KEY|BD_CRYPTO_TECH_MODE_REMOVE_KEY|BD_CRYPTO_TECH_MODE_RESIZE| - BD_CRYPTO_TECH_MODE_SUSPEND_RESUME|BD_CRYPTO_TECH_MODE_BACKUP_RESTORE); + BD_CRYPTO_TECH_MODE_SUSPEND_RESUME|BD_CRYPTO_TECH_MODE_BACKUP_RESTORE|BD_CRYPTO_TECH_MODE_MODIFY); if (ret != mode) { g_set_error_literal (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_TECH_UNAVAIL, - "Only 'create', 'open', 'query', 'add-key', 'remove-key', 'resize', 'suspend-resume', 'backup-restore' supported for LUKS"); + "Only 'create', 'open', 'query', 'add-key', 'remove-key', 'resize', 'suspend-resume', 'backup-restore', 'modify' supported for LUKS"); return FALSE; } else return TRUE; @@ -1023,11 +1023,31 @@ gboolean _crypto_luks_format (const gchar *device, if (min_entropy > 0) { dev_random_fd = open ("/dev/random", O_RDONLY); if (dev_random_fd >= 0) { - ioctl (dev_random_fd, RNDGETENTCNT, ¤t_entropy); + if (ioctl (dev_random_fd, RNDGETENTCNT, ¤t_entropy) < 0) { + g_set_error (&l_error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_FORMAT_FAILED, + "Failed to get random data entropy level: %s", + strerror_l (errno, c_locale)); + close (dev_random_fd); + crypt_free (cd); + g_strfreev (cipher_specs); + bd_utils_report_finished (progress_id, l_error->message); + g_propagate_error (error, l_error); + return FALSE; + } while (current_entropy < min_entropy) { bd_utils_report_progress (progress_id, 0, "Waiting for enough random data entropy"); sleep (1); - ioctl (dev_random_fd, RNDGETENTCNT, ¤t_entropy); + if (ioctl (dev_random_fd, RNDGETENTCNT, ¤t_entropy) < 0) { + g_set_error (&l_error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_FORMAT_FAILED, + "Failed to get random data entropy level: %s", + strerror_l (errno, c_locale)); + close (dev_random_fd); + crypt_free (cd); + g_strfreev (cipher_specs); + bd_utils_report_finished (progress_id, l_error->message); + g_propagate_error (error, l_error); + return FALSE; + } } close (dev_random_fd); } else { @@ -1422,6 +1442,7 @@ static gboolean _crypto_close (const gchar *device, const gchar *tech_name, GErr if (ret != 0) { g_set_error (&l_error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE, "Failed to initialize device: %s", strerror_l (-ret, c_locale)); + crypt_free (cd); bd_utils_report_finished (progress_id, l_error->message); g_propagate_error (error, l_error); return FALSE; @@ -1828,6 +1849,7 @@ gboolean bd_crypto_luks_resize (const gchar *luks_device, guint64 size, BDCrypto if (ret != 0) { g_set_error (&l_error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE, "Failed to initialize device: %s", strerror_l (-ret, c_locale)); + crypt_free (cd); bd_utils_report_finished (progress_id, l_error->message); g_propagate_error (error, l_error); return FALSE; @@ -1937,6 +1959,7 @@ gboolean bd_crypto_luks_suspend (const gchar *luks_device, GError **error) { if (ret != 0) { g_set_error (&l_error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE, "Failed to initialize device: %s", strerror_l (-ret, c_locale)); + crypt_free (cd); bd_utils_report_finished (progress_id, l_error->message); g_propagate_error (error, l_error); return FALSE; @@ -1986,6 +2009,7 @@ gboolean bd_crypto_luks_resume (const gchar *luks_device, BDCryptoKeyslotContext if (ret != 0) { g_set_error (&l_error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE, "Failed to initialize device: %s", strerror_l (-ret, c_locale)); + crypt_free (cd); bd_utils_report_finished (progress_id, l_error->message); g_propagate_error (error, l_error); return FALSE; @@ -2587,6 +2611,7 @@ BDCryptoLUKSInfo* bd_crypto_luks_info (const gchar *device, GError **error) { if (ret != 0) { g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE, "Failed to initialize device: %s", strerror_l (-ret, c_locale)); + crypt_free (cd); return NULL; } @@ -2742,6 +2767,7 @@ BDCryptoIntegrityInfo* bd_crypto_integrity_info (const gchar *device, GError **e if (ret != 0) { g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE, "Failed to initialize device: %s", strerror_l (-ret, c_locale)); + crypt_free (cd); return NULL; } @@ -2811,6 +2837,7 @@ BDCryptoLUKSTokenInfo** bd_crypto_luks_token_info (const gchar *device, GError * if (ret != 0) { g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE, "Failed to initialize device: %s", strerror_l (-ret, c_locale)); + crypt_free (cd); return NULL; } diff --git a/src/plugins/dm.c b/src/plugins/dm.c index f829fbee1..58b390333 100644 --- a/src/plugins/dm.c +++ b/src/plugins/dm.c @@ -176,7 +176,7 @@ gboolean bd_dm_remove (const gchar *map_name, GError **error) { gchar* bd_dm_name_from_node (const gchar *dm_node, GError **error) { gchar *ret = NULL; gboolean success = FALSE; - g_autofree gchar *sys_path = g_strdup_printf ("/sys/class/block/%s/dm/name", dm_node); + g_autofree gchar *sys_path = NULL; if (!dm_node || strlen (dm_node) == 0) { g_set_error_literal (error, BD_DM_ERROR, BD_DM_ERROR_DEVICE_NOEXIST, @@ -184,6 +184,8 @@ gchar* bd_dm_name_from_node (const gchar *dm_node, GError **error) { return NULL; } + sys_path = g_strdup_printf ("/sys/class/block/%s/dm/name", dm_node); + if (access (sys_path, R_OK) != 0) { g_set_error_literal (error, BD_DM_ERROR, BD_DM_ERROR_SYS, "Failed to access dm node's parameters under /sys"); diff --git a/src/plugins/fs/generic.c b/src/plugins/fs/generic.c index 87ed8b0ec..104cae419 100644 --- a/src/plugins/fs/generic.c +++ b/src/plugins/fs/generic.c @@ -820,9 +820,18 @@ static gboolean xfs_resize_device (const gchar *device, guint64 new_size, const return FALSE; } + if (xfs_info->block_size == 0) { + g_set_error (error, BD_FS_ERROR, BD_FS_ERROR_FAIL, + "Failed to get block size for device '%s'", device); + bd_fs_xfs_info_free (xfs_info); + return FALSE; + } + mountpoint = fs_mount (device, "xfs", FALSE, &unmount, error); - if (!mountpoint) + if (!mountpoint) { + bd_fs_xfs_info_free (xfs_info); return FALSE; + } new_size = (new_size + xfs_info->block_size - 1) / xfs_info->block_size; bd_fs_xfs_info_free (xfs_info); @@ -857,6 +866,13 @@ static gboolean f2fs_resize_device (const gchar *device, guint64 new_size, GErro return FALSE; } + if (info->sector_size == 0) { + g_set_error (error, BD_FS_ERROR, BD_FS_ERROR_FAIL, + "Failed to get sector size for device '%s'", device); + bd_fs_f2fs_info_free (info); + return FALSE; + } + /* round to nearest sector_size multiple */ new_size = (new_size + info->sector_size - 1) / info->sector_size; diff --git a/src/plugins/fs/mount.c b/src/plugins/fs/mount.c index 2691be109..05f272d58 100644 --- a/src/plugins/fs/mount.c +++ b/src/plugins/fs/mount.c @@ -510,6 +510,8 @@ static gboolean run_as_user (MountFunc func, MountArgs *args, uid_t run_as_uid, pid = fork (); if (pid == -1) { + close (pipefd[0]); + close (pipefd[1]); g_set_error_literal (error, BD_FS_ERROR, BD_FS_ERROR_FAIL, "Error forking."); return FALSE; @@ -694,8 +696,6 @@ gboolean bd_fs_unmount (const gchar *spec, gboolean lazy, gboolean force, const return ret; } else return do_unmount (&args, error); - - return TRUE; } /** @@ -777,8 +777,6 @@ gboolean bd_fs_mount (const gchar *device, const gchar *mountpoint, const gchar return ret; } else return do_mount (&args, error); - - return TRUE; } /** diff --git a/src/plugins/lvm/lvm-common.c b/src/plugins/lvm/lvm-common.c index 9b0481be5..499bc8fa9 100644 --- a/src/plugins/lvm/lvm-common.c +++ b/src/plugins/lvm/lvm-common.c @@ -61,6 +61,218 @@ GMutex global_config_lock; gchar *global_config_str = NULL; gchar *global_devices_str = NULL; +BDLVMPVdata* bd_lvm_pvdata_copy (BDLVMPVdata *data) { + if (data == NULL) + return NULL; + + BDLVMPVdata *new_data = g_new0 (BDLVMPVdata, 1); + + new_data->pv_name = g_strdup (data->pv_name); + new_data->pv_uuid = g_strdup (data->pv_uuid); + new_data->pv_free = data->pv_free; + new_data->pv_size = data->pv_size; + new_data->pe_start = data->pe_start; + new_data->vg_name = g_strdup (data->vg_name); + new_data->vg_uuid = g_strdup (data->vg_uuid); + new_data->vg_size = data->vg_size; + new_data->vg_free = data->vg_free; + new_data->vg_extent_size = data->vg_extent_size; + new_data->vg_extent_count = data->vg_extent_count; + new_data->vg_free_count = data->vg_free_count; + new_data->vg_pv_count = data->vg_pv_count; + new_data->pv_tags = g_strdupv (data->pv_tags); + new_data->missing = data->missing; + + return new_data; +} + +void bd_lvm_pvdata_free (BDLVMPVdata *data) { + if (data == NULL) + return; + + g_free (data->pv_name); + g_free (data->pv_uuid); + g_free (data->vg_name); + g_free (data->vg_uuid); + g_strfreev (data->pv_tags); + g_free (data); +} + +BDLVMVGdata* bd_lvm_vgdata_copy (BDLVMVGdata *data) { + if (data == NULL) + return NULL; + + BDLVMVGdata *new_data = g_new0 (BDLVMVGdata, 1); + + new_data->name = g_strdup (data->name); + new_data->uuid = g_strdup (data->uuid); + new_data->size = data->size; + new_data->free = data->free; + new_data->extent_size = data->extent_size; + new_data->extent_count = data->extent_count; + new_data->free_count = data->free_count; + new_data->pv_count = data->pv_count; + new_data->vg_tags = g_strdupv (data->vg_tags); + new_data->exported = data->exported; + return new_data; +} + +void bd_lvm_vgdata_free (BDLVMVGdata *data) { + if (data == NULL) + return; + + g_free (data->name); + g_free (data->uuid); + g_strfreev (data->vg_tags); + g_free (data); +} + +BDLVMSEGdata* bd_lvm_segdata_copy (BDLVMSEGdata *data) { + if (data == NULL) + return NULL; + + BDLVMSEGdata *new_data = g_new0 (BDLVMSEGdata, 1); + + new_data->size_pe = data->size_pe; + new_data->pv_start_pe = data->pv_start_pe; + new_data->pvdev = g_strdup (data->pvdev); + return new_data; +} + +void bd_lvm_segdata_free (BDLVMSEGdata *data) { + if (data == NULL) + return; + + g_free (data->pvdev); + g_free (data); +} + +static BDLVMSEGdata **copy_segs (BDLVMSEGdata **segs) { + int len; + BDLVMSEGdata **new_segs; + + if (segs == NULL) + return NULL; + + for (len = 0; segs[len]; len++) + ; + + new_segs = g_new0 (BDLVMSEGdata *, len+1); + for (int i = 0; i < len; i++) + new_segs[i] = bd_lvm_segdata_copy (segs[i]); + + return new_segs; +} + +static void free_segs (BDLVMSEGdata **segs) { + if (segs == NULL) + return; + + for (int i = 0; segs[i]; i++) + bd_lvm_segdata_free (segs[i]); + (g_free) (segs); +} + +BDLVMLVdata* bd_lvm_lvdata_copy (BDLVMLVdata *data) { + if (data == NULL) + return NULL; + + BDLVMLVdata *new_data = g_new0 (BDLVMLVdata, 1); + + new_data->lv_name = g_strdup (data->lv_name); + new_data->vg_name = g_strdup (data->vg_name); + new_data->uuid = g_strdup (data->uuid); + new_data->size = data->size; + new_data->attr = g_strdup (data->attr); + new_data->segtype = g_strdup (data->segtype); + new_data->origin = g_strdup (data->origin); + new_data->pool_lv = g_strdup (data->pool_lv); + new_data->data_lv = g_strdup (data->data_lv); + new_data->metadata_lv = g_strdup (data->metadata_lv); + new_data->roles = g_strdup (data->roles); + new_data->move_pv = g_strdup (data->move_pv); + new_data->data_percent = data->data_percent; + new_data->metadata_percent = data->metadata_percent; + new_data->copy_percent = data->copy_percent; + new_data->lv_tags = g_strdupv (data->lv_tags); + new_data->data_lvs = g_strdupv (data->data_lvs); + new_data->metadata_lvs = g_strdupv (data->metadata_lvs); + new_data->segs = copy_segs (data->segs); + return new_data; +} + +void bd_lvm_lvdata_free (BDLVMLVdata *data) { + if (data == NULL) + return; + + g_free (data->lv_name); + g_free (data->vg_name); + g_free (data->uuid); + g_free (data->attr); + g_free (data->segtype); + g_free (data->origin); + g_free (data->pool_lv); + g_free (data->data_lv); + g_free (data->metadata_lv); + g_free (data->roles); + g_free (data->move_pv); + g_strfreev (data->lv_tags); + g_strfreev (data->data_lvs); + g_strfreev (data->metadata_lvs); + free_segs (data->segs); + g_free (data); +} + +BDLVMVDOPooldata* bd_lvm_vdopooldata_copy (BDLVMVDOPooldata *data) { + if (data == NULL) + return NULL; + + BDLVMVDOPooldata *new_data = g_new0 (BDLVMVDOPooldata, 1); + + new_data->operating_mode = data->operating_mode; + new_data->compression_state = data->compression_state; + new_data->index_state = data->index_state; + new_data->write_policy = data->write_policy; + new_data->used_size = data->used_size; + new_data->saving_percent = data->saving_percent; + new_data->index_memory_size = data->index_memory_size; + new_data->deduplication = data->deduplication; + new_data->compression = data->compression; + return new_data; +} + +void bd_lvm_vdopooldata_free (BDLVMVDOPooldata *data) { + if (data == NULL) + return; + + g_free (data); +} + +BDLVMCacheStats* bd_lvm_cache_stats_copy (BDLVMCacheStats *data) { + if (data == NULL) + return NULL; + + BDLVMCacheStats *new = g_new0 (BDLVMCacheStats, 1); + + new->block_size = data->block_size; + new->cache_size = data->cache_size; + new->cache_used = data->cache_used; + new->md_block_size = data->md_block_size; + new->md_size = data->md_size; + new->md_used = data->md_used; + new->read_hits = data->read_hits; + new->read_misses = data->read_misses; + new->write_hits = data->write_hits; + new->write_misses = data->write_misses; + new->mode = data->mode; + + return new; +} + +void bd_lvm_cache_stats_free (BDLVMCacheStats *data) { + g_free (data); +} + /** * bd_lvm_is_supported_pe_size: * @size: size (in bytes) to test @@ -789,7 +1001,7 @@ gchar* bd_lvm_config_get (const gchar *section, const gchar *setting, const gcha } gboolean _vgcfgbackup_restore (const gchar *command, const gchar *vg_name, const gchar *file, const BDExtraArg **extra, GError **error) { - const gchar *args[6] = {"lvm", NULL, NULL, NULL, NULL, NULL}; + const gchar *args[7] = {"lvm", NULL, NULL, NULL, NULL, NULL, NULL}; guint next_arg = 1; g_autofree gchar *config_arg = NULL; diff --git a/src/plugins/lvm/lvm-dbus.c b/src/plugins/lvm/lvm-dbus.c index 31f64676a..9a79f728c 100644 --- a/src/plugins/lvm/lvm-dbus.c +++ b/src/plugins/lvm/lvm-dbus.c @@ -80,139 +80,6 @@ GQuark bd_lvm_error_quark (void) return g_quark_from_static_string ("g-bd-lvm-error-quark"); } -BDLVMPVdata* bd_lvm_pvdata_copy (BDLVMPVdata *data) { - if (data == NULL) - return NULL; - - BDLVMPVdata *new_data = g_new0 (BDLVMPVdata, 1); - - new_data->pv_name = g_strdup (data->pv_name); - new_data->pv_uuid = g_strdup (data->pv_uuid); - new_data->pv_free = data->pv_free; - new_data->pv_size = data->pv_size; - new_data->pe_start = data->pe_start; - new_data->vg_name = g_strdup (data->vg_name); - new_data->vg_uuid = g_strdup (data->vg_uuid); - new_data->vg_size = data->vg_size; - new_data->vg_free = data->vg_free; - new_data->vg_extent_size = data->vg_extent_size; - new_data->vg_extent_count = data->vg_extent_count; - new_data->vg_free_count = data->vg_free_count; - new_data->vg_pv_count = data->vg_pv_count; - new_data->pv_tags = g_strdupv (data->pv_tags); - - return new_data; -} - -void bd_lvm_pvdata_free (BDLVMPVdata *data) { - if (data == NULL) - return; - - g_free (data->pv_name); - g_free (data->pv_uuid); - g_free (data->vg_name); - g_free (data->vg_uuid); - g_strfreev (data->pv_tags); - g_free (data); -} - -BDLVMVGdata* bd_lvm_vgdata_copy (BDLVMVGdata *data) { - if (data == NULL) - return NULL; - - BDLVMVGdata *new_data = g_new0 (BDLVMVGdata, 1); - - new_data->name = g_strdup (data->name); - new_data->uuid = g_strdup (data->uuid); - new_data->size = data->size; - new_data->free = data->free; - new_data->extent_size = data->extent_size; - new_data->extent_count = data->extent_count; - new_data->free_count = data->free_count; - new_data->pv_count = data->pv_count; - new_data->vg_tags = g_strdupv (data->vg_tags); - return new_data; -} - -void bd_lvm_vgdata_free (BDLVMVGdata *data) { - if (data == NULL) - return; - - g_free (data->name); - g_free (data->uuid); - g_strfreev (data->vg_tags); - g_free (data); -} - -BDLVMLVdata* bd_lvm_lvdata_copy (BDLVMLVdata *data) { - if (data == NULL) - return NULL; - - BDLVMLVdata *new_data = g_new0 (BDLVMLVdata, 1); - - new_data->lv_name = g_strdup (data->lv_name); - new_data->vg_name = g_strdup (data->vg_name); - new_data->uuid = g_strdup (data->uuid); - new_data->size = data->size; - new_data->attr = g_strdup (data->attr); - new_data->segtype = g_strdup (data->segtype); - new_data->origin = g_strdup (data->origin); - new_data->pool_lv = g_strdup (data->pool_lv); - new_data->data_lv = g_strdup (data->data_lv); - new_data->metadata_lv = g_strdup (data->metadata_lv); - new_data->roles = g_strdup (data->roles); - new_data->move_pv = g_strdup (data->move_pv); - new_data->data_percent = data->data_percent; - new_data->metadata_percent = data->metadata_percent; - new_data->copy_percent = data->copy_percent; - new_data->lv_tags = g_strdupv (data->lv_tags); - return new_data; -} - -void bd_lvm_lvdata_free (BDLVMLVdata *data) { - if (data == NULL) - return; - - g_free (data->lv_name); - g_free (data->vg_name); - g_free (data->uuid); - g_free (data->attr); - g_free (data->segtype); - g_free (data->origin); - g_free (data->pool_lv); - g_free (data->data_lv); - g_free (data->metadata_lv); - g_free (data->roles); - g_free (data->move_pv); - g_strfreev (data->lv_tags); - g_free (data); -} - -BDLVMCacheStats* bd_lvm_cache_stats_copy (BDLVMCacheStats *data) { - if (data == NULL) - return NULL; - - BDLVMCacheStats *new = g_new0 (BDLVMCacheStats, 1); - - new->block_size = data->block_size; - new->cache_size = data->cache_size; - new->cache_used = data->cache_used; - new->md_block_size = data->md_block_size; - new->md_size = data->md_size; - new->md_used = data->md_used; - new->read_hits = data->read_hits; - new->read_misses = data->read_misses; - new->write_hits = data->write_hits; - new->write_misses = data->write_misses; - new->mode = data->mode; - - return new; -} - -void bd_lvm_cache_stats_free (BDLVMCacheStats *data) { - g_free (data); -} - static gboolean setup_dbus_connection (GError **error) { gchar *addr = NULL; @@ -278,7 +145,7 @@ static const DBusDep dbus_deps[DBUS_DEPS_LAST] = { #define FEATURES_VDO 0 #define FEATURES_VDO_MASK (1 << FEATURES_VDO) -#define FEATURES_WRITECACHE 0 +#define FEATURES_WRITECACHE 1 #define FEATURES_WRITECACHE_MASK (1 << FEATURES_WRITECACHE) #define FEATURES_LAST 2 @@ -821,6 +688,15 @@ static gboolean call_lvm_method_sync (const gchar *obj, const gchar *intf, const g_free (log_msg); } else { ret = get_object_property (task_path, JOB_INTF, "GetError", &l_error); + if (!ret) { + if (!l_error) + g_set_error (&l_error, BD_LVM_ERROR, BD_LVM_ERROR_FAIL, + "Failed to get error from '%s' method of the '%s' object", + method, obj); + bd_utils_report_finished (prog_id, l_error->message); + g_propagate_error (error, l_error); + return FALSE; + } g_variant_get (ret, "(is)", &error_code, &error_msg); if (error_code != 0) { if (error_msg) { @@ -941,6 +817,8 @@ static GVariant* get_lvm_object_properties (const gchar *obj_id, const gchar *if ret = g_dbus_connection_call_sync (bus, LVM_BUS_NAME, MANAGER_OBJ, MANAGER_INTF, "LookUpByLvmId", args, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, error); + if (!ret) + return NULL; g_variant_get (ret, "(o)", &obj_path); g_variant_unref (ret); @@ -1366,14 +1244,18 @@ static BDLVMLVdata* get_lv_data_from_props (GVariant *props, GError **error G_GN g_variant_dict_lookup (&dict, "Vg", "o", &path); name = get_object_property (path, VG_INTF, "Name", NULL); g_free (path); - g_variant_get (name, "s", &(data->vg_name)); - g_variant_unref (name); + if (name) { + g_variant_get (name, "s", &(data->vg_name)); + g_variant_unref (name); + } g_variant_dict_lookup (&dict, "OriginLv", "o", &path); if (g_strcmp0 (path, "/") != 0) { name = get_object_property (path, LV_CMN_INTF, "Name", NULL); - g_variant_get (name, "s", &(data->origin)); - g_variant_unref (name); + if (name) { + g_variant_get (name, "s", &(data->origin)); + g_variant_unref (name); + } } g_free (path); path = NULL; @@ -1381,8 +1263,10 @@ static BDLVMLVdata* get_lv_data_from_props (GVariant *props, GError **error G_GN g_variant_dict_lookup (&dict, "PoolLv", "o", &path); if (g_strcmp0 (path, "/") != 0) { name = get_object_property (path, LV_CMN_INTF, "Name", NULL); - g_variant_get (name, "s", &(data->pool_lv)); - g_variant_unref (name); + if (name) { + g_variant_get (name, "s", &(data->pool_lv)); + g_variant_unref (name); + } } g_free (path); path = NULL; @@ -1390,8 +1274,10 @@ static BDLVMLVdata* get_lv_data_from_props (GVariant *props, GError **error G_GN g_variant_dict_lookup (&dict, "MovePv", "o", &path); if (path && g_strcmp0 (path, "/") != 0) { name = get_object_property (path, PV_INTF, "Name", NULL); - g_variant_get (name, "s", &(data->move_pv)); - g_variant_unref (name); + if (name) { + g_variant_get (name, "s", &(data->move_pv)); + g_variant_unref (name); + } } g_free (path); path = NULL; @@ -1972,6 +1858,7 @@ gboolean bd_lvm_vgcreate (const gchar *name, const gchar **pv_list, guint64 pe_s return FALSE; } g_variant_builder_add_value (&builder, g_variant_new ("o", path)); + g_free (path); } pvs = g_variant_builder_end (&builder); g_variant_builder_clear (&builder); @@ -2375,6 +2262,7 @@ gboolean bd_lvm_lvcreate (const gchar *vg_name, const gchar *lv_name, guint64 si return FALSE; } g_variant_builder_add_value (&builder, g_variant_new ("(ott)", path, (guint64) 0, (guint64) 0)); + g_free (path); } pvs = g_variant_builder_end (&builder); g_variant_builder_clear (&builder); @@ -2529,6 +2417,7 @@ gboolean bd_lvm_lvrepair (const gchar *vg_name, const gchar *lv_name, const gcha return FALSE; } g_variant_builder_add_value (&builder, g_variant_new ("o", path)); + g_free (path); } pvs = g_variant_builder_end (&builder); g_variant_builder_clear (&builder); @@ -2539,8 +2428,6 @@ gboolean bd_lvm_lvrepair (const gchar *vg_name, const gchar *lv_name, const gcha g_variant_builder_clear (&builder); return call_lv_method_sync (vg_name, lv_name, "RepairRaidLv", params, NULL, extra, TRUE, error); - - return FALSE; } /** @@ -2637,7 +2524,7 @@ gboolean bd_lvm_lvsnapshotcreate (const gchar *vg_name, const gchar *origin_name */ gboolean bd_lvm_lvsnapshotmerge (const gchar *vg_name, const gchar *snapshot_name, const BDExtraArg **extra, GError **error) { gchar *obj_id = NULL; - gchar *obj_path = NULL; + g_autofree gchar *obj_path = NULL; /* get object path for vg_name/snapshot_name and call SNAP_INTF, "Merge" */ obj_id = g_strdup_printf ("%s/%s", vg_name, snapshot_name); @@ -3693,6 +3580,7 @@ gchar* bd_lvm_cache_pool_name (const gchar *vg_name, const gchar *cached_lv, GEr if (!prop) return NULL; g_variant_get (prop, "o", &pool_obj_path); + g_variant_unref (prop); prop = get_object_property (pool_obj_path, LV_CMN_INTF, "Name", error); g_free (pool_obj_path); if (!prop) @@ -3745,8 +3633,8 @@ gboolean bd_lvm_thpool_convert (const gchar *vg_name, const gchar *data_lv, cons GVariantBuilder builder; GVariant *params = NULL; gchar *obj_id = NULL; - gchar *data_lv_path = NULL; - gchar *metadata_lv_path = NULL; + g_autofree gchar *data_lv_path = NULL; + g_autofree gchar *metadata_lv_path = NULL; gboolean ret = FALSE; obj_id = g_strdup_printf ("%s/%s", vg_name, data_lv); @@ -3795,8 +3683,8 @@ gboolean bd_lvm_cache_pool_convert (const gchar *vg_name, const gchar *data_lv, GVariantBuilder builder; GVariant *params = NULL; gchar *obj_id = NULL; - gchar *data_lv_path = NULL; - gchar *metadata_lv_path = NULL; + g_autofree gchar *data_lv_path = NULL; + g_autofree gchar *metadata_lv_path = NULL; gboolean ret = FALSE; obj_id = g_strdup_printf ("%s/%s", vg_name, data_lv); diff --git a/src/plugins/lvm/lvm.c b/src/plugins/lvm/lvm.c index 76c4cd7e7..a049f9ef3 100644 --- a/src/plugins/lvm/lvm.c +++ b/src/plugins/lvm/lvm.c @@ -48,218 +48,6 @@ GQuark bd_lvm_error_quark (void) return g_quark_from_static_string ("g-bd-lvm-error-quark"); } -BDLVMPVdata* bd_lvm_pvdata_copy (BDLVMPVdata *data) { - if (data == NULL) - return NULL; - - BDLVMPVdata *new_data = g_new0 (BDLVMPVdata, 1); - - new_data->pv_name = g_strdup (data->pv_name); - new_data->pv_uuid = g_strdup (data->pv_uuid); - new_data->pv_free = data->pv_free; - new_data->pv_size = data->pv_size; - new_data->pe_start = data->pe_start; - new_data->vg_name = g_strdup (data->vg_name); - new_data->vg_uuid = g_strdup (data->vg_uuid); - new_data->vg_size = data->vg_size; - new_data->vg_free = data->vg_free; - new_data->vg_extent_size = data->vg_extent_size; - new_data->vg_extent_count = data->vg_extent_count; - new_data->vg_free_count = data->vg_free_count; - new_data->vg_pv_count = data->vg_pv_count; - new_data->pv_tags = g_strdupv (data->pv_tags); - new_data->missing = data->missing; - - return new_data; -} - -void bd_lvm_pvdata_free (BDLVMPVdata *data) { - if (data == NULL) - return; - - g_free (data->pv_name); - g_free (data->pv_uuid); - g_free (data->vg_name); - g_free (data->vg_uuid); - g_strfreev (data->pv_tags); - g_free (data); -} - -BDLVMVGdata* bd_lvm_vgdata_copy (BDLVMVGdata *data) { - if (data == NULL) - return NULL; - - BDLVMVGdata *new_data = g_new0 (BDLVMVGdata, 1); - - new_data->name = g_strdup (data->name); - new_data->uuid = g_strdup (data->uuid); - new_data->size = data->size; - new_data->free = data->free; - new_data->extent_size = data->extent_size; - new_data->extent_count = data->extent_count; - new_data->free_count = data->free_count; - new_data->pv_count = data->pv_count; - new_data->vg_tags = g_strdupv (data->vg_tags); - return new_data; -} - -void bd_lvm_vgdata_free (BDLVMVGdata *data) { - if (data == NULL) - return; - - g_free (data->name); - g_free (data->uuid); - g_strfreev (data->vg_tags); - g_free (data); -} - -BDLVMSEGdata* bd_lvm_segdata_copy (BDLVMSEGdata *data) { - if (data == NULL) - return NULL; - - BDLVMSEGdata *new_data = g_new0 (BDLVMSEGdata, 1); - - new_data->size_pe = data->size_pe; - new_data->pv_start_pe = data->pv_start_pe; - new_data->pvdev = g_strdup (data->pvdev); - return new_data; -} - -void bd_lvm_segdata_free (BDLVMSEGdata *data) { - if (data == NULL) - return; - - g_free (data->pvdev); - g_free (data); -} - -static BDLVMSEGdata **copy_segs (BDLVMSEGdata **segs) { - int len; - BDLVMSEGdata **new_segs; - - if (segs == NULL) - return NULL; - - for (len = 0; segs[len]; len++) - ; - - new_segs = g_new0 (BDLVMSEGdata *, len+1); - for (int i = 0; i < len; i++) - new_segs[i] = bd_lvm_segdata_copy (segs[i]); - - return new_segs; -} - -static void free_segs (BDLVMSEGdata **segs) { - if (segs == NULL) - return; - - for (int i = 0; segs[i]; i++) - bd_lvm_segdata_free (segs[i]); - (g_free) (segs); -} - -BDLVMLVdata* bd_lvm_lvdata_copy (BDLVMLVdata *data) { - if (data == NULL) - return NULL; - - BDLVMLVdata *new_data = g_new0 (BDLVMLVdata, 1); - - new_data->lv_name = g_strdup (data->lv_name); - new_data->vg_name = g_strdup (data->vg_name); - new_data->uuid = g_strdup (data->uuid); - new_data->size = data->size; - new_data->attr = g_strdup (data->attr); - new_data->segtype = g_strdup (data->segtype); - new_data->origin = g_strdup (data->origin); - new_data->pool_lv = g_strdup (data->pool_lv); - new_data->data_lv = g_strdup (data->data_lv); - new_data->metadata_lv = g_strdup (data->metadata_lv); - new_data->roles = g_strdup (data->roles); - new_data->move_pv = g_strdup (data->move_pv); - new_data->data_percent = data->data_percent; - new_data->metadata_percent = data->metadata_percent; - new_data->copy_percent = data->copy_percent; - new_data->lv_tags = g_strdupv (data->lv_tags); - new_data->data_lvs = g_strdupv (data->data_lvs); - new_data->metadata_lvs = g_strdupv (data->metadata_lvs); - new_data->segs = copy_segs (data->segs); - return new_data; -} - -void bd_lvm_lvdata_free (BDLVMLVdata *data) { - if (data == NULL) - return; - - g_free (data->lv_name); - g_free (data->vg_name); - g_free (data->uuid); - g_free (data->attr); - g_free (data->segtype); - g_free (data->origin); - g_free (data->pool_lv); - g_free (data->data_lv); - g_free (data->metadata_lv); - g_free (data->roles); - g_free (data->move_pv); - g_strfreev (data->lv_tags); - g_strfreev (data->data_lvs); - g_strfreev (data->metadata_lvs); - free_segs (data->segs); - g_free (data); -} - -BDLVMVDOPooldata* bd_lvm_vdopooldata_copy (BDLVMVDOPooldata *data) { - if (data == NULL) - return NULL; - - BDLVMVDOPooldata *new_data = g_new0 (BDLVMVDOPooldata, 1); - - new_data->operating_mode = data->operating_mode; - new_data->compression_state = data->compression_state; - new_data->index_state = data->index_state; - new_data->write_policy = data->write_policy; - new_data->used_size = data->used_size; - new_data->saving_percent = data->saving_percent; - new_data->index_memory_size = data->index_memory_size; - new_data->deduplication = data->deduplication; - new_data->compression = data->compression; - return new_data; -} - -void bd_lvm_vdopooldata_free (BDLVMVDOPooldata *data) { - if (data == NULL) - return; - - g_free (data); -} - -BDLVMCacheStats* bd_lvm_cache_stats_copy (BDLVMCacheStats *data) { - if (data == NULL) - return NULL; - - BDLVMCacheStats *new = g_new0 (BDLVMCacheStats, 1); - - new->block_size = data->block_size; - new->cache_size = data->cache_size; - new->cache_used = data->cache_used; - new->md_block_size = data->md_block_size; - new->md_size = data->md_size; - new->md_used = data->md_used; - new->read_hits = data->read_hits; - new->read_misses = data->read_misses; - new->write_hits = data->write_hits; - new->write_misses = data->write_misses; - new->mode = data->mode; - - return new; -} - -void bd_lvm_cache_stats_free (BDLVMCacheStats *data) { - g_free (data); -} - - static volatile guint avail_deps = 0; static volatile guint avail_features = 0; static volatile guint avail_module_deps = 0; @@ -445,6 +233,43 @@ static gboolean call_lvm_and_capture_output (const gchar **args, const BDExtraAr return success; } +static gboolean call_lvm_and_report_progress (const gchar **args, const BDExtraArg **extra, BDUtilsProgExtract prog_extract, gint *proc_status, GError **error) { + gboolean success = FALSE; + guint i = 0; + guint args_length = g_strv_length ((gchar **) args); + g_autofree gchar *config_arg = NULL; + g_autofree gchar *devices_arg = NULL; + + if (!check_deps (&avail_deps, DEPS_LVM_MASK, deps, DEPS_LAST, &deps_check_lock, error)) + return FALSE; + + /* don't allow global config string changes during the run */ + g_mutex_lock (&global_config_lock); + + /* allocate enough space for the args plus "lvm", "--config", "--devices" and NULL */ + const gchar **argv = g_new0 (const gchar*, args_length + 4); + + /* construct argv from args with "lvm" prepended */ + argv[0] = "lvm"; + for (i=0; i < args_length; i++) + argv[i+1] = args[i]; + if (global_config_str) { + config_arg = g_strdup_printf ("--config=%s", global_config_str); + argv[++args_length] = config_arg; + } + if (global_devices_str) { + devices_arg = g_strdup_printf ("--devices=%s", global_devices_str); + argv[++args_length] = devices_arg; + } + argv[++args_length] = NULL; + + success = bd_utils_exec_and_report_progress (argv, extra, prog_extract, proc_status, error); + g_mutex_unlock (&global_config_lock); + g_free (argv); + + return success; +} + /** * parse_lvm_vars: * @str: string to parse @@ -1008,7 +833,7 @@ gboolean bd_lvm_pvmove (const gchar *src, const gchar *dest, const BDExtraArg ** if (dest) args[4] = dest; - return bd_utils_exec_and_report_progress (args, extra, extract_pvmove_progress, &status, error); + return call_lvm_and_report_progress (args, extra, extract_pvmove_progress, &status, error); } /** diff --git a/src/plugins/nvdimm.c b/src/plugins/nvdimm.c index f6b2bea3f..c26b1f948 100644 --- a/src/plugins/nvdimm.c +++ b/src/plugins/nvdimm.c @@ -300,6 +300,7 @@ gboolean bd_nvdimm_namespace_enable (const gchar *namespace, const BDExtraArg ** if (!ndns) { g_set_error (error, BD_NVDIMM_ERROR, BD_NVDIMM_ERROR_NAMESPACE_NOEXIST, "Failed to enable namespace: namespace '%s' not found.", namespace); + ndctl_unref (ctx); return FALSE; } @@ -343,6 +344,7 @@ gboolean bd_nvdimm_namespace_disable (const gchar *namespace, const BDExtraArg * if (!ndns) { g_set_error (error, BD_NVDIMM_ERROR, BD_NVDIMM_ERROR_NAMESPACE_NOEXIST, "Failed to disable namespace: namespace '%s' not found.", namespace); + ndctl_unref (ctx); return FALSE; } diff --git a/src/plugins/part.c b/src/plugins/part.c index 4efff9b94..2878b99fa 100644 --- a/src/plugins/part.c +++ b/src/plugins/part.c @@ -135,6 +135,7 @@ static gint log2i (guint x) { static gint get_part_num (const gchar *part, GError **error) { const gchar *part_num_str = NULL; gint part_num = -1; + gsize i = 0; if (!part || *part == '\0') { g_set_error (error, BD_PART_ERROR, BD_PART_ERROR_INVAL, @@ -142,11 +143,10 @@ static gint get_part_num (const gchar *part, GError **error) { return -1; } - part_num_str = part + (strlen (part) - 1); - while (isdigit (*part_num_str) || (*part_num_str == '-')) { - part_num_str--; - } - part_num_str++; + i = strlen (part); + while (i > 0 && (isdigit ((unsigned char) part[i - 1]) || part[i - 1] == '-')) + i--; + part_num_str = part + i; part_num = atoi (part_num_str); if (part_num == 0) { diff --git a/src/plugins/s390.c b/src/plugins/s390.c index 0df102f7b..841dcc707 100644 --- a/src/plugins/s390.c +++ b/src/plugins/s390.c @@ -1003,6 +1003,7 @@ gboolean bd_s390_zfcp_offline (const gchar *devno, const gchar *wwpn, const gcha } rc = fputs (lun, fd); if (rc == EOF) { + fclose (fd); g_set_error (&l_error, BD_S390_ERROR, BD_S390_ERROR_DEVICE, "Could not remove LUN %s at WWPN %s on zFCP device %s", lun, wwpn, devno); g_free (unitrm); diff --git a/src/python/gi/overrides/BlockDev.py b/src/python/gi/overrides/BlockDev.py index b084dea48..a968a31ba 100644 --- a/src/python/gi/overrides/BlockDev.py +++ b/src/python/gi/overrides/BlockDev.py @@ -1279,7 +1279,7 @@ def wrapped(*args, **kwargs): raise xrule.new_exc(msg) # try to find exact type match - transform = next((tr_t for tr_t in self._tr_excs if self._tr_excs == e_type), None) + transform = next((tr_t for tr_t in self._tr_excs if tr_t[0] == e_type), None) if not transform: # no exact match, but we still caught the exception -> must be some child class transform = next(tr_t for tr_t in self._tr_excs if isinstance(e, tr_t[0])) diff --git a/src/utils/exec.c b/src/utils/exec.c index 08fc73564..846fd8a72 100644 --- a/src/utils/exec.c +++ b/src/utils/exec.c @@ -231,6 +231,7 @@ gboolean bd_utils_exec_and_capture_output_no_progress (const gchar **argv, const /* error is already populated from the call */ g_free (stdout_data); g_free (stderr_data); + g_free (args); return FALSE; } @@ -247,6 +248,7 @@ gboolean bd_utils_exec_and_capture_output_no_progress (const gchar **argv, const /* process was terminated abnormally (e.g. using a signal) */ g_free (stdout_data); g_free (stderr_data); + g_free (args); g_propagate_error (error, l_error); return FALSE; } @@ -465,6 +467,9 @@ static gboolean _utils_exec_and_report_progress (const gchar **argv, const BDExt g_propagate_error (error, l_error); /* would overwrite errno, need to close as a last step */ close (in_fd); + close (out_fd); + close (err_fd); + waitpid (pid, NULL, 0); return FALSE; } close (in_fd); @@ -519,22 +524,25 @@ static gboolean _utils_exec_and_report_progress (const gchar **argv, const BDExt close (err_fd); child_ret = waitpid (pid, &status, 0); - *proc_status = WEXITSTATUS (status); if (success) { if (child_ret > 0) { - if (*proc_status != 0) { - msg = stderr_data->len > 0 ? stderr_data->str : stdout_data->str; + if (WIFSIGNALED (status)) { + *proc_status = 128 + WTERMSIG (status); g_set_error (&l_error, BD_UTILS_EXEC_ERROR, BD_UTILS_EXEC_ERROR_FAILED, - "Process reported exit code %d: %s", *proc_status, msg); + "Process killed with a signal"); bd_utils_report_finished (progress_id, l_error->message); g_propagate_error (error, l_error); success = FALSE; - } else if (WIFSIGNALED (status)) { - g_set_error_literal (&l_error, BD_UTILS_EXEC_ERROR, BD_UTILS_EXEC_ERROR_FAILED, - "Process killed with a signal"); + } else if (WIFEXITED (status) && WEXITSTATUS (status) != 0) { + *proc_status = WEXITSTATUS (status); + msg = stderr_data->len > 0 ? stderr_data->str : stdout_data->str; + g_set_error (&l_error, BD_UTILS_EXEC_ERROR, BD_UTILS_EXEC_ERROR_FAILED, + "Process reported exit code %d: %s", *proc_status, msg); bd_utils_report_finished (progress_id, l_error->message); g_propagate_error (error, l_error); success = FALSE; + } else { + *proc_status = WIFEXITED (status) ? WEXITSTATUS (status) : 0; } } else if (child_ret == -1) { if (errno != ECHILD) { diff --git a/tests/utils.py b/tests/utils.py index b2c9ef20b..3cdd0c6d5 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -261,7 +261,7 @@ def clean_scsi_debug(scsi_debug_dev): if os.path.exists('/sys/block/' + device): write_file('/sys/block/%s/device/delete' % device, '1') n_tries = 0 - while os.path.exists(device) and n_tries < 5: + while os.path.exists('/dev/' + device) and n_tries < 5: time.sleep(0.5) n_tries += 1 n_tries = 0