diff --git a/SOURCES/0004-memory-leaks.patch b/SOURCES/0004-memory-leaks.patch new file mode 100644 index 0000000..1c3f087 --- /dev/null +++ b/SOURCES/0004-memory-leaks.patch @@ -0,0 +1,914 @@ +From 0789fc7f227b557d9633402bf9971ff7a6360447 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Wed, 24 Apr 2019 16:03:31 +0200 +Subject: [PATCH 01/17] lvm: Fix some obvious memory leaks + +--- + src/plugins/lvm.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c +index 87ff5a4..a23f8fd 100644 +--- a/src/plugins/lvm.c ++++ b/src/plugins/lvm.c +@@ -371,6 +371,7 @@ static GHashTable* parse_lvm_vars (const gchar *str, guint *num_items) { + if (g_strv_length (key_val) == 2) { + /* we only want to process valid lines (with the '=' character) */ + g_hash_table_insert (table, key_val[0], key_val[1]); ++ g_free (key_val); + (*num_items)++; + } else + /* invalid line, just free key_val */ +@@ -972,6 +973,7 @@ BDLVMPVdata* bd_lvm_pvinfo (const gchar *device, GError **error) { + if (table) + g_hash_table_destroy (table); + } ++ g_strfreev (lines); + + /* getting here means no usable info was found */ + g_set_error (error, BD_LVM_ERROR, BD_LVM_ERROR_PARSE, +@@ -1039,6 +1041,7 @@ BDLVMPVdata** bd_lvm_pvs (GError **error) { + if (pvs->len == 0) { + g_set_error (error, BD_LVM_ERROR, BD_LVM_ERROR_PARSE, + "Failed to parse information about PVs"); ++ g_ptr_array_free (pvs, TRUE); + return NULL; + } + +@@ -1247,6 +1250,7 @@ BDLVMVGdata* bd_lvm_vginfo (const gchar *vg_name, GError **error) { + if (table) + g_hash_table_destroy (table); + } ++ g_strfreev (lines); + + /* getting here means no usable info was found */ + g_set_error (error, BD_LVM_ERROR, BD_LVM_ERROR_PARSE, +@@ -1312,6 +1316,7 @@ BDLVMVGdata** bd_lvm_vgs (GError **error) { + if (vgs->len == 0) { + g_set_error (error, BD_LVM_ERROR, BD_LVM_ERROR_PARSE, + "Failed to parse information about VGs"); ++ g_ptr_array_free (vgs, TRUE); + return NULL; + } + +@@ -1641,6 +1646,7 @@ BDLVMLVdata* bd_lvm_lvinfo (const gchar *vg_name, const gchar *lv_name, GError * + if (table) + g_hash_table_destroy (table); + } ++ g_strfreev (lines); + + /* getting here means no usable info was found */ + g_set_error (error, BD_LVM_ERROR, BD_LVM_ERROR_PARSE, +@@ -1713,6 +1719,7 @@ BDLVMLVdata** bd_lvm_lvs (const gchar *vg_name, GError **error) { + if (lvs->len == 0) { + g_set_error (error, BD_LVM_ERROR, BD_LVM_ERROR_PARSE, + "Failed to parse information about LVs"); ++ g_ptr_array_free (lvs, FALSE); + return NULL; + } + +-- +2.21.0 + + +From 552173cfcb77d9ed3476b55e0170627998081912 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Wed, 24 Apr 2019 16:27:07 +0200 +Subject: [PATCH 02/17] lvm: Use g_ptr_array_free() for creating lists + +No need to allocate separate array and copy elements one by one, use +g_ptr_array_free() instead and only add the trailing NULL element as +a regular item. + +This fixes leaks of the array shell. +--- + src/plugins/lvm.c | 88 ++++++++++++++++++++--------------------------- + 1 file changed, 37 insertions(+), 51 deletions(-) + +diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c +index a23f8fd..c2f2bf8 100644 +--- a/src/plugins/lvm.c ++++ b/src/plugins/lvm.c +@@ -1001,24 +1001,25 @@ BDLVMPVdata** bd_lvm_pvs (GError **error) { + gchar **lines = NULL; + gchar **lines_p = NULL; + guint num_items; +- GPtrArray *pvs = g_ptr_array_new (); ++ GPtrArray *pvs; + BDLVMPVdata *pvdata = NULL; +- BDLVMPVdata **ret = NULL; +- guint64 i = 0; + +- success = call_lvm_and_capture_output (args, NULL, &output, error); ++ pvs = g_ptr_array_new (); + ++ success = call_lvm_and_capture_output (args, NULL, &output, error); + if (!success) { + if (g_error_matches (*error, BD_UTILS_EXEC_ERROR, BD_UTILS_EXEC_ERROR_NOOUT)) { + /* no output => no VGs, not an error */ + g_clear_error (error); +- ret = g_new0 (BDLVMPVdata*, 1); +- ret[0] = NULL; +- return ret; ++ /* return an empty list */ ++ g_ptr_array_add (pvs, NULL); ++ return (BDLVMPVdata **) g_ptr_array_free (pvs, FALSE); + } +- else ++ else { + /* the error is already populated from the call */ ++ g_ptr_array_free (pvs, TRUE); + return NULL; ++ } + } + + lines = g_strsplit (output, "\n", 0); +@@ -1045,15 +1046,9 @@ BDLVMPVdata** bd_lvm_pvs (GError **error) { + return NULL; + } + +- /* now create the return value -- NULL-terminated array of BDLVMPVdata */ +- ret = g_new0 (BDLVMPVdata*, pvs->len + 1); +- for (i=0; i < pvs->len; i++) +- ret[i] = (BDLVMPVdata*) g_ptr_array_index (pvs, i); +- ret[i] = NULL; +- +- g_ptr_array_free (pvs, FALSE); +- +- return ret; ++ /* returning NULL-terminated array of BDLVMPVdata */ ++ g_ptr_array_add (pvs, NULL); ++ return (BDLVMPVdata **) g_ptr_array_free (pvs, FALSE); + } + + /** +@@ -1277,23 +1272,25 @@ BDLVMVGdata** bd_lvm_vgs (GError **error) { + gchar **lines = NULL; + gchar **lines_p = NULL; + guint num_items; +- GPtrArray *vgs = g_ptr_array_new (); ++ GPtrArray *vgs; + BDLVMVGdata *vgdata = NULL; +- BDLVMVGdata **ret = NULL; +- guint64 i = 0; ++ ++ vgs = g_ptr_array_new (); + + success = call_lvm_and_capture_output (args, NULL, &output, error); + if (!success) { + if (g_error_matches (*error, BD_UTILS_EXEC_ERROR, BD_UTILS_EXEC_ERROR_NOOUT)) { + /* no output => no VGs, not an error */ + g_clear_error (error); +- ret = g_new0 (BDLVMVGdata*, 1); +- ret[0] = NULL; +- return ret; ++ /* return an empty list */ ++ g_ptr_array_add (vgs, NULL); ++ return (BDLVMVGdata **) g_ptr_array_free (vgs, FALSE); + } +- else ++ else { + /* the error is already populated from the call */ ++ g_ptr_array_free (vgs, TRUE); + return NULL; ++ } + } + + lines = g_strsplit (output, "\n", 0); +@@ -1320,15 +1317,9 @@ BDLVMVGdata** bd_lvm_vgs (GError **error) { + return NULL; + } + +- /* now create the return value -- NULL-terminated array of BDLVMVGdata */ +- ret = g_new0 (BDLVMVGdata*, vgs->len + 1); +- for (i=0; i < vgs->len; i++) +- ret[i] = (BDLVMVGdata*) g_ptr_array_index (vgs, i); +- ret[i] = NULL; +- +- g_ptr_array_free (vgs, FALSE); +- +- return ret; ++ /* returning NULL-terminated array of BDLVMVGdata */ ++ g_ptr_array_add (vgs, NULL); ++ return (BDLVMVGdata **) g_ptr_array_free (vgs, FALSE); + } + + /** +@@ -1676,27 +1667,28 @@ BDLVMLVdata** bd_lvm_lvs (const gchar *vg_name, GError **error) { + gchar **lines = NULL; + gchar **lines_p = NULL; + guint num_items; +- GPtrArray *lvs = g_ptr_array_new (); ++ GPtrArray *lvs; + BDLVMLVdata *lvdata = NULL; +- BDLVMLVdata **ret = NULL; +- guint64 i = 0; ++ ++ lvs = g_ptr_array_new (); + + if (vg_name) + args[9] = vg_name; + + success = call_lvm_and_capture_output (args, NULL, &output, error); +- + if (!success) { + if (g_error_matches (*error, BD_UTILS_EXEC_ERROR, BD_UTILS_EXEC_ERROR_NOOUT)) { + /* no output => no LVs, not an error */ + g_clear_error (error); +- ret = g_new0 (BDLVMLVdata*, 1); +- ret[0] = NULL; +- return ret; ++ /* return an empty list */ ++ g_ptr_array_add (lvs, NULL); ++ return (BDLVMLVdata **) g_ptr_array_free (lvs, FALSE); + } +- else ++ else { + /* the error is already populated from the call */ ++ g_ptr_array_free (lvs, TRUE); + return NULL; ++ } + } + + lines = g_strsplit (output, "\n", 0); +@@ -1719,19 +1711,13 @@ BDLVMLVdata** bd_lvm_lvs (const gchar *vg_name, GError **error) { + if (lvs->len == 0) { + g_set_error (error, BD_LVM_ERROR, BD_LVM_ERROR_PARSE, + "Failed to parse information about LVs"); +- g_ptr_array_free (lvs, FALSE); ++ g_ptr_array_free (lvs, TRUE); + return NULL; + } + +- /* now create the return value -- NULL-terminated array of BDLVMLVdata */ +- ret = g_new0 (BDLVMLVdata*, lvs->len + 1); +- for (i=0; i < lvs->len; i++) +- ret[i] = (BDLVMLVdata*) g_ptr_array_index (lvs, i); +- ret[i] = NULL; +- +- g_ptr_array_free (lvs, FALSE); +- +- return ret; ++ /* returning NULL-terminated array of BDLVMLVdata */ ++ g_ptr_array_add (lvs, NULL); ++ return (BDLVMLVdata **) g_ptr_array_free (lvs, FALSE); + } + + /** +-- +2.21.0 + + +From fa48a6e64181e7becadbad8202be6de1829b4b9b Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Wed, 24 Apr 2019 16:31:52 +0200 +Subject: [PATCH 03/17] lvm: Fix leaking BDLVMPVdata.vg_uuid + +--- + src/lib/plugin_apis/lvm.api | 2 ++ + src/plugins/lvm.c | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/src/lib/plugin_apis/lvm.api b/src/lib/plugin_apis/lvm.api +index ce47c51..bffe2ce 100644 +--- a/src/lib/plugin_apis/lvm.api ++++ b/src/lib/plugin_apis/lvm.api +@@ -114,6 +114,7 @@ BDLVMPVdata* bd_lvm_pvdata_copy (BDLVMPVdata *data) { + 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; +@@ -136,6 +137,7 @@ void bd_lvm_pvdata_free (BDLVMPVdata *data) { + g_free (data->pv_name); + g_free (data->pv_uuid); + g_free (data->vg_name); ++ g_free (data->vg_uuid); + g_free (data); + } + +diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c +index c2f2bf8..a6d738d 100644 +--- a/src/plugins/lvm.c ++++ b/src/plugins/lvm.c +@@ -63,6 +63,7 @@ BDLVMPVdata* bd_lvm_pvdata_copy (BDLVMPVdata *data) { + 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; +@@ -80,6 +81,7 @@ void bd_lvm_pvdata_free (BDLVMPVdata *data) { + g_free (data->pv_name); + g_free (data->pv_uuid); + g_free (data->vg_name); ++ g_free (data->vg_uuid); + g_free (data); + } + +-- +2.21.0 + + +From 1b44335a35d8d886f3a251f1c51d1f1039651d4e Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Wed, 24 Apr 2019 18:36:21 +0200 +Subject: [PATCH 04/17] exec: Fix some memory leaks + +--- + src/utils/exec.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/src/utils/exec.c b/src/utils/exec.c +index 28635a1..b1ca436 100644 +--- a/src/utils/exec.c ++++ b/src/utils/exec.c +@@ -228,8 +228,12 @@ gboolean bd_utils_exec_and_report_status_error (const gchar **argv, const BDExtr + log_out (task_id, stdout_data, stderr_data); + log_done (task_id, *status); + ++ g_free (args); ++ + if (!success) { + /* error is already populated from the call */ ++ g_free (stdout_data); ++ g_free (stderr_data); + return FALSE; + } + +@@ -247,7 +251,6 @@ gboolean bd_utils_exec_and_report_status_error (const gchar **argv, const BDExtr + return FALSE; + } + +- g_free (args); + g_free (stdout_data); + g_free (stderr_data); + return TRUE; +@@ -398,14 +401,17 @@ gboolean bd_utils_exec_and_report_progress (const gchar **argv, const BDExtraArg + G_SPAWN_DEFAULT|G_SPAWN_SEARCH_PATH|G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, &pid, NULL, &out_fd, &err_fd, error); + +- if (!ret) ++ if (!ret) { + /* error is already populated */ ++ g_free (args); + return FALSE; ++ } + + args_str = g_strjoinv (" ", args ? (gchar **) args : (gchar **) argv); + msg = g_strdup_printf ("Started '%s'", args_str); + progress_id = bd_utils_report_started (msg); + g_free (args_str); ++ g_free (args); + g_free (msg); + + out_pipe = g_io_channel_unix_new (out_fd); +-- +2.21.0 + + +From e943381bf7c1aeb27f6e308f95e3f64436f25247 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 9 May 2019 15:39:24 +0200 +Subject: [PATCH 05/17] mdraid: Fix g_strsplit() leaks + +--- + src/plugins/mdraid.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c +index 6465dfe..178379e 100644 +--- a/src/plugins/mdraid.c ++++ b/src/plugins/mdraid.c +@@ -255,10 +255,15 @@ static GHashTable* parse_mdadm_vars (const gchar *str, const gchar *item_sep, co + /* mdadm --examine output for a set being migrated */ + vals = g_strsplit (key_val[1], "<--", 2); + g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (vals[0])); ++ g_free (key_val[1]); + g_free (vals[1]); ++ g_free (vals); + } else { + g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (key_val[1])); + } ++ g_free (key_val); ++ } else { ++ g_strfreev (key_val); + } + (*num_items)++; + } else +-- +2.21.0 + + +From 21fba5737901b6fa82b3c04bb9058ac650b8e54d Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 9 May 2019 15:39:39 +0200 +Subject: [PATCH 06/17] s390: Fix g_strsplit() leaks + +--- + src/plugins/s390.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/src/plugins/s390.c b/src/plugins/s390.c +index dcb5bc9..ac12b04 100644 +--- a/src/plugins/s390.c ++++ b/src/plugins/s390.c +@@ -775,8 +775,6 @@ gboolean bd_s390_zfcp_scsi_offline(const gchar *devno, const gchar *wwpn, const + gchar *hba_path = NULL; + gchar *wwpn_path = NULL; + gchar *lun_path = NULL; +- gchar *host = NULL; +- gchar *fcplun = NULL; + gchar *scsidev = NULL; + gchar *fcpsysfs = NULL; + gchar *scsidel = NULL; +@@ -804,13 +802,11 @@ gboolean bd_s390_zfcp_scsi_offline(const gchar *devno, const gchar *wwpn, const + /* tokenize line and assign certain values we'll need later */ + tokens = g_strsplit (line, delim, 8); + +- host = tokens[1]; +- fcplun = tokens[7]; +- +- scsidev = g_strdup_printf ("%s:%s:%s:%s", host + 4, channel, devid, fcplun); ++ scsidev = g_strdup_printf ("%s:%s:%s:%s", tokens[1] /* host */ + 4, channel, devid, tokens[7] /* fcplun */); + scsidev = g_strchomp (scsidev); + fcpsysfs = g_strdup_printf ("%s/%s", scsidevsysfs, scsidev); + fcpsysfs = g_strchomp (fcpsysfs); ++ g_strfreev (tokens); + + /* get HBA path value (same as device number) */ + hba_path = g_strdup_printf ("%s/hba_id", fcpsysfs); +-- +2.21.0 + + +From 9e751457a983a4ba07fcd285b15af29aad051b25 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 9 May 2019 16:10:11 +0200 +Subject: [PATCH 07/17] ext: Fix g_strsplit() leaks + +--- + src/plugins/fs/ext.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/plugins/fs/ext.c b/src/plugins/fs/ext.c +index 03ac1c5..98f2861 100644 +--- a/src/plugins/fs/ext.c ++++ b/src/plugins/fs/ext.c +@@ -534,6 +534,7 @@ static GHashTable* parse_output_vars (const gchar *str, const gchar *item_sep, c + if (g_strv_length (key_val) == 2) { + /* we only want to process valid lines (with the separator) */ + g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (key_val[1])); ++ g_free (key_val); + (*num_items)++; + } else + /* invalid line, just free key_val */ +-- +2.21.0 + + +From bb774818d210f7159ed0b7db11c1a8490ac7ee0f Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 9 May 2019 16:15:36 +0200 +Subject: [PATCH 08/17] ext: Fix g_match_info_fetch() leaks + +--- + src/plugins/fs/ext.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/src/plugins/fs/ext.c b/src/plugins/fs/ext.c +index 98f2861..91b0ff5 100644 +--- a/src/plugins/fs/ext.c ++++ b/src/plugins/fs/ext.c +@@ -96,13 +96,23 @@ static gint8 filter_line_fsck (const gchar * line, guint8 total_stages, GError * + guint8 stage; + gint64 val_cur; + gint64 val_total; ++ gchar *s; + + /* The output_regex ensures we have a number in these matches, so we can skip + * tests for conversion errors. + */ +- stage = (guint8) g_ascii_strtoull (g_match_info_fetch (match_info, 1), (char **)NULL, 10); +- val_cur = g_ascii_strtoll (g_match_info_fetch (match_info, 2), (char **)NULL, 10); +- val_total = g_ascii_strtoll (g_match_info_fetch (match_info, 3), (char **)NULL, 10); ++ s = g_match_info_fetch (match_info, 1); ++ stage = (guint8) g_ascii_strtoull (s, (char **)NULL, 10); ++ g_free (s); ++ ++ s = g_match_info_fetch (match_info, 2); ++ val_cur = g_ascii_strtoll (s, (char **)NULL, 10); ++ g_free (s); ++ ++ s = g_match_info_fetch (match_info, 3); ++ val_total = g_ascii_strtoll (s, (char **)NULL, 10); ++ g_free (s); ++ + perc = compute_percents (stage, total_stages, val_cur, val_total); + } else { + g_match_info_free (match_info); +-- +2.21.0 + + +From 70779be74507b5e8a3d4d6c5a226906186844f0b Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 9 May 2019 16:16:06 +0200 +Subject: [PATCH 09/17] kbd: Fix g_match_info_fetch() leaks + +--- + src/plugins/kbd.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/src/plugins/kbd.c b/src/plugins/kbd.c +index 33208c7..a2908ec 100644 +--- a/src/plugins/kbd.c ++++ b/src/plugins/kbd.c +@@ -782,7 +782,11 @@ gboolean bd_kbd_bcache_create (const gchar *backing_device, const gchar *cache_d + for (i=0; lines[i] && n < 2; i++) { + success = g_regex_match (regex, lines[i], 0, &match_info); + if (success) { +- strncpy (device_uuid[n], g_match_info_fetch (match_info, 1), 63); ++ gchar *s; ++ ++ s = g_match_info_fetch (match_info, 1); ++ strncpy (device_uuid[n], s, 63); ++ g_free (s); + device_uuid[n][63] = '\0'; + n++; + g_match_info_free (match_info); +-- +2.21.0 + + +From 9c364521d3a7b0b8c04061003f16d73eee8778c8 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 9 May 2019 17:16:37 +0200 +Subject: [PATCH 10/17] part: Fix leaking objects + +--- + src/plugins/part.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/plugins/part.c b/src/plugins/part.c +index 31c6591..cf62366 100644 +--- a/src/plugins/part.c ++++ b/src/plugins/part.c +@@ -913,6 +913,8 @@ static gboolean resize_part (PedPartition *part, PedDevice *dev, PedDisk *disk, + return FALSE; + } + ++ ped_geometry_destroy (geom); ++ ped_constraint_destroy (constr); + finish_alignment_constraint (disk, orig_flag_state); + return TRUE; + } +-- +2.21.0 + + +From 2d24ea310fe65b020d7ef3450057bde1383910aa Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 9 May 2019 17:17:01 +0200 +Subject: [PATCH 11/17] ext: Fix leaking string + +--- + src/plugins/fs/ext.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/plugins/fs/ext.c b/src/plugins/fs/ext.c +index 91b0ff5..fbec90a 100644 +--- a/src/plugins/fs/ext.c ++++ b/src/plugins/fs/ext.c +@@ -560,8 +560,10 @@ static BDFSExtInfo* get_ext_info_from_table (GHashTable *table, gboolean free_ta + gchar *value = NULL; + + ret->label = g_strdup ((gchar*) g_hash_table_lookup (table, "Filesystem volume name")); +- if ((!ret->label) || (g_strcmp0 (ret->label, "") == 0)) ++ if (!ret->label || g_strcmp0 (ret->label, "") == 0) { ++ g_free (ret->label); + ret->label = g_strdup (""); ++ } + ret->uuid = g_strdup ((gchar*) g_hash_table_lookup (table, "Filesystem UUID")); + ret->state = g_strdup ((gchar*) g_hash_table_lookup (table, "Filesystem state")); + +-- +2.21.0 + + +From 957b4b84eeaacab612ea5e267dc37b194f9d65f3 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 9 May 2019 18:23:46 +0200 +Subject: [PATCH 12/17] part: Fix leaking string in args + +--- + src/plugins/part.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/src/plugins/part.c b/src/plugins/part.c +index cf62366..8b2285f 100644 +--- a/src/plugins/part.c ++++ b/src/plugins/part.c +@@ -373,10 +373,9 @@ static gchar* get_part_type_guid_and_gpt_flags (const gchar *device, int part_nu + + args[1] = g_strdup_printf ("-i%d", part_num); + success = bd_utils_exec_and_capture_output (args, NULL, &output, error); +- if (!success) { +- g_free ((gchar *) args[1]); ++ g_free ((gchar *) args[1]); ++ if (!success) + return FALSE; +- } + + lines = g_strsplit (output, "\n", 0); + g_free (output); +-- +2.21.0 + + +From 6613cc6b28766607801f95b54bcbc872de02412b Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 16 May 2019 12:46:56 +0200 +Subject: [PATCH 13/17] mdraid: Fix leaking error + +--- + src/plugins/mdraid.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c +index 178379e..8f5b2ca 100644 +--- a/src/plugins/mdraid.c ++++ b/src/plugins/mdraid.c +@@ -178,7 +178,7 @@ gboolean bd_md_check_deps (void) { + } + + if (!ret) +- g_warning("Cannot load the MDRAID plugin"); ++ g_warning ("Cannot load the MDRAID plugin"); + + return ret; + } +@@ -357,8 +357,7 @@ static BDMDExamineData* get_examine_data_from_table (GHashTable *table, gboolean + } + + if (bs_error) { +- g_set_error (error, BD_MD_ERROR, BD_MD_ERROR_PARSE, +- "Failed to parse chunk size from mdexamine data: %s", bs_error->msg); ++ g_warning ("get_examine_data_from_table(): Failed to parse chunk size from mdexamine data: %s", bs_error->msg); + bs_clear_error (&bs_error); + } + } else +-- +2.21.0 + + +From 9ad488f460f65abded312be4b5cf1f00f9fc8aa5 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 16 May 2019 12:54:09 +0200 +Subject: [PATCH 14/17] mdraid: Mark 'error' arg in + get_examine_data_from_table() as unused + +--- + src/plugins/mdraid.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c +index 8f5b2ca..a333e6f 100644 +--- a/src/plugins/mdraid.c ++++ b/src/plugins/mdraid.c +@@ -275,7 +275,7 @@ static GHashTable* parse_mdadm_vars (const gchar *str, const gchar *item_sep, co + return table; + } + +-static BDMDExamineData* get_examine_data_from_table (GHashTable *table, gboolean free_table, GError **error) { ++static BDMDExamineData* get_examine_data_from_table (GHashTable *table, gboolean free_table, G_GNUC_UNUSED GError **error) { + BDMDExamineData *data = g_new0 (BDMDExamineData, 1); + gchar *value = NULL; + gchar *first_space = NULL; +-- +2.21.0 + + +From eaa07958b928141783202967cbae0e86fdee488d Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 16 May 2019 12:55:50 +0200 +Subject: [PATCH 15/17] mdraid: Fix leaking BDMDExamineData.metadata + +--- + src/plugins/mdraid.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c +index a333e6f..74af744 100644 +--- a/src/plugins/mdraid.c ++++ b/src/plugins/mdraid.c +@@ -1049,6 +1049,7 @@ BDMDExamineData* bd_md_examine (const gchar *device, GError **error) { + } + + /* try to get metadata version from the output (may be missing) */ ++ g_free (ret->metadata); + value = (gchar*) g_hash_table_lookup (table, "metadata"); + if (value) + ret->metadata = g_strdup (value); +-- +2.21.0 + + +From 6b384841027c22f3fac28dd295e8a6124d4d7498 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 16 May 2019 17:40:51 +0200 +Subject: [PATCH 16/17] btrfs: Fix number of memory leaks + +--- + src/plugins/btrfs.c | 40 ++++++++++++++++++++++------------------ + 1 file changed, 22 insertions(+), 18 deletions(-) + +diff --git a/src/plugins/btrfs.c b/src/plugins/btrfs.c +index c76ea3f..8a2c81a 100644 +--- a/src/plugins/btrfs.c ++++ b/src/plugins/btrfs.c +@@ -619,9 +619,7 @@ BDBtrfsDeviceInfo** bd_btrfs_list_devices (const gchar *device, GError **error) + "path[ \\t]+(?P\\S+)\n"; + GRegex *regex = NULL; + GMatchInfo *match_info = NULL; +- guint8 i = 0; +- GPtrArray *dev_infos = g_ptr_array_new (); +- BDBtrfsDeviceInfo** ret = NULL; ++ GPtrArray *dev_infos; + + if (!check_deps (&avail_deps, DEPS_BTRFS_MASK, deps, DEPS_LAST, &deps_check_lock, error) || + !check_module_deps (&avail_module_deps, MODULE_DEPS_BTRFS_MASK, module_deps, MODULE_DEPS_LAST, &deps_check_lock, error)) +@@ -635,13 +633,16 @@ BDBtrfsDeviceInfo** bd_btrfs_list_devices (const gchar *device, GError **error) + } + + success = bd_utils_exec_and_capture_output (argv, NULL, &output, error); +- if (!success) ++ if (!success) { ++ g_regex_unref (regex); + /* error is already populated from the previous call */ + return NULL; ++ } + + lines = g_strsplit (output, "\n", 0); + g_free (output); + ++ dev_infos = g_ptr_array_new (); + for (line_p = lines; *line_p; line_p++) { + success = g_regex_match (regex, *line_p, 0, &match_info); + if (!success) { +@@ -654,21 +655,16 @@ BDBtrfsDeviceInfo** bd_btrfs_list_devices (const gchar *device, GError **error) + } + + g_strfreev (lines); ++ g_regex_unref (regex); + + if (dev_infos->len == 0) { + g_set_error (error, BD_BTRFS_ERROR, BD_BTRFS_ERROR_PARSE, "Failed to parse information about devices"); ++ g_ptr_array_free (dev_infos, TRUE); + return NULL; + } + +- /* now create the return value -- NULL-terminated array of BDBtrfsDeviceInfo */ +- ret = g_new0 (BDBtrfsDeviceInfo*, dev_infos->len + 1); +- for (i=0; i < dev_infos->len; i++) +- ret[i] = (BDBtrfsDeviceInfo*) g_ptr_array_index (dev_infos, i); +- ret[i] = NULL; +- +- g_ptr_array_free (dev_infos, FALSE); +- +- return ret; ++ g_ptr_array_add (dev_infos, NULL); ++ return (BDBtrfsDeviceInfo **) g_ptr_array_free (dev_infos, FALSE); + } + + /** +@@ -700,7 +696,7 @@ BDBtrfsSubvolumeInfo** bd_btrfs_list_subvolumes (const gchar *mountpoint, gboole + guint64 i = 0; + guint64 y = 0; + guint64 next_sorted_idx = 0; +- GPtrArray *subvol_infos = g_ptr_array_new (); ++ GPtrArray *subvol_infos; + BDBtrfsSubvolumeInfo* item = NULL; + BDBtrfsSubvolumeInfo* swap_item = NULL; + BDBtrfsSubvolumeInfo** ret = NULL; +@@ -724,11 +720,11 @@ BDBtrfsSubvolumeInfo** bd_btrfs_list_subvolumes (const gchar *mountpoint, gboole + + success = bd_utils_exec_and_capture_output (argv, NULL, &output, error); + if (!success) { ++ g_regex_unref (regex); + if (g_error_matches (*error, BD_UTILS_EXEC_ERROR, BD_UTILS_EXEC_ERROR_NOOUT)) { + /* no output -> no subvolumes */ +- ret = g_new0 (BDBtrfsSubvolumeInfo*, 1); + g_clear_error (error); +- return ret; ++ return g_new0 (BDBtrfsSubvolumeInfo*, 1); + } else { + /* error is already populated from the call above or simply no output*/ + return NULL; +@@ -738,6 +734,7 @@ BDBtrfsSubvolumeInfo** bd_btrfs_list_subvolumes (const gchar *mountpoint, gboole + lines = g_strsplit (output, "\n", 0); + g_free (output); + ++ subvol_infos = g_ptr_array_new (); + for (line_p = lines; *line_p; line_p++) { + success = g_regex_match (regex, *line_p, 0, &match_info); + if (!success) { +@@ -750,9 +747,11 @@ BDBtrfsSubvolumeInfo** bd_btrfs_list_subvolumes (const gchar *mountpoint, gboole + } + + g_strfreev (lines); ++ g_regex_unref (regex); + + if (subvol_infos->len == 0) { + g_set_error (error, BD_BTRFS_ERROR, BD_BTRFS_ERROR_PARSE, "Failed to parse information about subvolumes"); ++ g_ptr_array_free (subvol_infos, TRUE); + return NULL; + } + +@@ -828,21 +827,26 @@ BDBtrfsFilesystemInfo* bd_btrfs_filesystem_info (const gchar *device, GError **e + } + + success = bd_utils_exec_and_capture_output (argv, NULL, &output, error); +- if (!success) ++ if (!success) { + /* error is already populated from the call above or just empty + output */ ++ g_regex_unref (regex); + return NULL; ++ } + + success = g_regex_match (regex, output, 0, &match_info); + if (!success) { + g_regex_unref (regex); + g_match_info_free (match_info); ++ g_free (output); + return NULL; + } + +- g_regex_unref (regex); + ret = get_filesystem_info_from_match (match_info); + g_match_info_free (match_info); ++ g_regex_unref (regex); ++ ++ g_free (output); + + return ret; + } +-- +2.21.0 + + +From 6f0ec1d90584c59da9bb5f22f692b7d5ebfb2708 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Fri, 17 May 2019 16:09:50 +0200 +Subject: [PATCH 17/17] module: Fix libkmod related leak + +--- + src/utils/module.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/src/utils/module.c b/src/utils/module.c +index 0709633..cdad960 100644 +--- a/src/utils/module.c ++++ b/src/utils/module.c +@@ -60,7 +60,7 @@ gboolean bd_utils_have_kernel_module (const gchar *module_name, GError **error) + return FALSE; + } + /* prevent libkmod from spamming our STDERR */ +- kmod_set_log_priority(ctx, LOG_CRIT); ++ kmod_set_log_priority (ctx, LOG_CRIT); + + ret = kmod_module_new_from_name (ctx, module_name, &mod); + if (ret < 0) { +@@ -106,7 +106,7 @@ gboolean bd_utils_load_kernel_module (const gchar *module_name, const gchar *opt + return FALSE; + } + /* prevent libkmod from spamming our STDERR */ +- kmod_set_log_priority(ctx, LOG_CRIT); ++ kmod_set_log_priority (ctx, LOG_CRIT); + + ret = kmod_module_new_from_name (ctx, module_name, &mod); + if (ret < 0) { +@@ -169,7 +169,7 @@ gboolean bd_utils_unload_kernel_module (const gchar *module_name, GError **error + return FALSE; + } + /* prevent libkmod from spamming our STDERR */ +- kmod_set_log_priority(ctx, LOG_CRIT); ++ kmod_set_log_priority (ctx, LOG_CRIT); + + ret = kmod_module_new_from_loaded (ctx, &list); + if (ret < 0) { +@@ -187,6 +187,7 @@ gboolean bd_utils_unload_kernel_module (const gchar *module_name, GError **error + else + kmod_module_unref (mod); + } ++ kmod_module_unref_list (list); + + if (!found) { + g_set_error (error, BD_UTILS_MODULE_ERROR, BD_UTILS_MODULE_ERROR_NOEXIST, +-- +2.21.0 + diff --git a/SOURCES/0005-swap-status-on-dm.patch b/SOURCES/0005-swap-status-on-dm.patch new file mode 100644 index 0000000..2f95a3c --- /dev/null +++ b/SOURCES/0005-swap-status-on-dm.patch @@ -0,0 +1,66 @@ +From 3d75598da3fda5344934fe9cd86297856f340909 Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Tue, 12 Feb 2019 12:21:03 +0100 +Subject: [PATCH] Fix checking swap status on lvm/md + +'bd_utils_resolve_device' returns already resolved part, there is +no '../' to remove. + +Resolves: rhbz#1649815 +--- + src/plugins/swap.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +diff --git a/src/plugins/swap.c b/src/plugins/swap.c +index 28db6f3..c8cdb57 100644 +--- a/src/plugins/swap.c ++++ b/src/plugins/swap.c +@@ -400,7 +400,6 @@ gboolean bd_swap_swapoff (const gchar *device, GError **error) { + gboolean bd_swap_swapstatus (const gchar *device, GError **error) { + gchar *file_content; + gchar *real_device = NULL; +- gchar *dev_path = NULL; + gsize length; + gchar *next_line; + gboolean success; +@@ -414,19 +413,15 @@ gboolean bd_swap_swapstatus (const gchar *device, GError **error) { + /* get the real device node for device-mapper devices since the ones + with meaningful names are just dev_paths */ + if (g_str_has_prefix (device, "/dev/mapper/") || g_str_has_prefix (device, "/dev/md/")) { +- dev_path = bd_utils_resolve_device (device, error); +- if (!dev_path) { ++ real_device = bd_utils_resolve_device (device, error); ++ if (!real_device) { + /* the device doesn't exist and thus is not an active swap */ + g_clear_error (error); + return FALSE; + } +- +- /* the dev_path starts with "../" */ +- real_device = g_strdup_printf ("/dev/%s", dev_path + 3); + } + + if (g_str_has_prefix (file_content, real_device ? real_device : device)) { +- g_free (dev_path); + g_free (real_device); + g_free (file_content); + return TRUE; +@@ -435,7 +430,6 @@ gboolean bd_swap_swapstatus (const gchar *device, GError **error) { + next_line = (strchr (file_content, '\n') + 1); + while (next_line && ((gsize)(next_line - file_content) < length)) { + if (g_str_has_prefix (next_line, real_device ? real_device : device)) { +- g_free (dev_path); + g_free (real_device); + g_free (file_content); + return TRUE; +@@ -444,7 +438,6 @@ gboolean bd_swap_swapstatus (const gchar *device, GError **error) { + next_line = (strchr (next_line, '\n') + 1); + } + +- g_free (dev_path); + g_free (real_device); + g_free (file_content); + return FALSE; +-- +2.20.1 + diff --git a/SPECS/libblockdev.spec b/SPECS/libblockdev.spec index 9fd0d25..c9b3160 100644 --- a/SPECS/libblockdev.spec +++ b/SPECS/libblockdev.spec @@ -120,7 +120,7 @@ Name: libblockdev Version: 2.19 -Release: 9%{?dist} +Release: 11%{?dist} Summary: A library for low-level manipulation with block devices License: LGPLv2+ URL: https://github.com/storaged-project/libblockdev @@ -128,6 +128,8 @@ Source0: https://github.com/storaged-project/libblockdev/releases/download/% Patch0: 0001-swap-error-codes.patch Patch1: 0002-major-minor-macros.patch Patch2: 0003-gating-tests-changes.patch +Patch3: 0004-memory-leaks.patch +Patch4: 0005-swap-status-on-dm.patch BuildRequires: glib2-devel %if %{with_gi} @@ -659,6 +661,8 @@ A meta-package that pulls all the libblockdev plugins as dependencies. %patch0 -p1 %patch1 -p1 %patch2 -p1 +%patch3 -p1 +%patch4 -p1 %build autoreconf -ivf @@ -958,6 +962,14 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm} %files plugins-all %changelog +* Mon Jun 06 2019 Vojtech Trefny - 2.19-10 +- Fix checking swap status on lvm/md (vtrefny) + Resolves: rhbz#1649815 + +* Thu May 30 2019 Tomas Bzatek - 2.19-10 +- Memory leak fixes (tbzatek) + Resolves: rhbz#1714276 + * Mon May 06 2019 Vojtech Trefny - 2.19-9 - Remove device-mapper-multipath dependency from fs and part plugins (vtrefny) Resolves: rhbz#1700297