master - hints: check for _touch_hints
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=61a483a654d87fc514d...
Commit: 61a483a654d87fc514dd4e7570467797247b6031
Parent: c38be0653111e3d63efbbf2f8914c83f15a73e70
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 18:01:05 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
hints: check for _touch_hints
Exit when !_touch_hints().
---
lib/label/hints.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/lib/label/hints.c b/lib/label/hints.c
index 8739f33..c6039d5 100644
--- a/lib/label/hints.c
+++ b/lib/label/hints.c
@@ -1261,8 +1261,9 @@ int get_hints(struct cmd_context *cmd, struct dm_list *hints_out, int *newhints,
*/
if (_newhints_exists()) {
log_debug("get_hints: newhints file");
- if (!_hints_exists())
- _touch_hints();
+ if (!_hints_exists() && !_touch_hints())
+ return 0;
+
if (!_lock_hints(cmd, LOCK_EX, NONBLOCK))
return 0;
/* create new hints after scan */
4 years, 5 months
master - hints: fix mem leaking buffers
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=c38be0653111e3d63ef...
Commit: c38be0653111e3d63efbbf2f8914c83f15a73e70
Parent: 1349a52626610abc6bfc20871e592c050048380d
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 18:00:54 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
hints: fix mem leaking buffers
---
lib/label/hints.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/lib/label/hints.c b/lib/label/hints.c
index df1327a..8739f33 100644
--- a/lib/label/hints.c
+++ b/lib/label/hints.c
@@ -1200,6 +1200,8 @@ check:
return;
}
}
+
+ free(name);
}
/*
@@ -1353,6 +1355,9 @@ int get_hints(struct cmd_context *cmd, struct dm_list *hints_out, int *newhints,
dm_list_size(devs_out), dm_list_size(devs_in));
dm_list_splice(hints_out, &hints_list);
+
+ free(vgname);
+
return 1;
}
4 years, 5 months
master - hints: validate allocation result
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=1349a52626610abc6bf...
Commit: 1349a52626610abc6bfc20871e592c050048380d
Parent: 219fe7235922cdcd559138def0a46a48ceaf528e
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 18:00:00 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
hints: validate allocation result
---
lib/label/hints.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/label/hints.c b/lib/label/hints.c
index 09f12de..df1327a 100644
--- a/lib/label/hints.c
+++ b/lib/label/hints.c
@@ -1175,7 +1175,8 @@ static void _get_single_vgname_cmd_arg(struct cmd_context *cmd,
if (!(st = strchr(arg, '/'))) {
/* simple vgname */
- name = strdup(arg);
+ if (!(name = strdup(arg)))
+ return;
goto check;
}
@@ -1183,7 +1184,8 @@ static void _get_single_vgname_cmd_arg(struct cmd_context *cmd,
for (p = arg; p < st; p++)
namebuf[i++] = *p;
- name = strdup(namebuf);
+ if (!(name = strdup(namebuf)))
+ return;
check:
/*
4 years, 5 months
master - hints: validate sscanf results
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=219fe7235922cdcd559...
Commit: 219fe7235922cdcd559138def0a46a48ceaf528e
Parent: d4d82dbb706da711cad73f045be7932ce1b23407
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 17:59:17 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
hints: validate sscanf results
---
lib/label/hints.c | 13 ++++++++-----
1 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/lib/label/hints.c b/lib/label/hints.c
index ec43dd3..09f12de 100644
--- a/lib/label/hints.c
+++ b/lib/label/hints.c
@@ -716,10 +716,9 @@ static int _read_hint_file(struct cmd_context *cmd, struct dm_list *hints, int *
keylen = strlen("scan_lvs:");
if (!strncmp(_hint_line, "scan_lvs:", keylen)) {
int scan_lvs = 0;
- sscanf(_hint_line + keylen, "%u", &scan_lvs);
-
- if (scan_lvs != cmd->scan_lvs) {
- log_debug("ignore hints with different scan_lvs");
+ if ((sscanf(_hint_line + keylen, "%u", &scan_lvs) != 1) ||
+ scan_lvs != cmd->scan_lvs) {
+ log_debug("ignore hints with different or unreadable scan_lvs");
*needs_refresh = 1;
break;
}
@@ -728,7 +727,11 @@ static int _read_hint_file(struct cmd_context *cmd, struct dm_list *hints, int *
keylen = strlen("devs_hash:");
if (!strncmp(_hint_line, "devs_hash:", keylen)) {
- sscanf(_hint_line + keylen, "%u %u", &read_hash, &read_count);
+ if (sscanf(_hint_line + keylen, "%u %u", &read_hash, &read_count) != 2) {
+ log_debug("ignore hints with invalid devs_hash");
+ *needs_refresh = 1;
+ break;
+ }
continue;
}
4 years, 5 months
master - hints: allocate hint only when needed
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d4d82dbb706da711cad...
Commit: d4d82dbb706da711cad73f045be7932ce1b23407
Parent: 70fb31b5d6863248b5adfb2581b706cbb158b30e
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 17:57:43 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
hints: allocate hint only when needed
Avoid mem leaking hint on every loop continue and
allocate hint only when it's going to be added into list.
Switch to use 'dm_strncpy()' and validate sizes.
---
lib/label/hints.c | 30 ++++++++++++++++++------------
1 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/lib/label/hints.c b/lib/label/hints.c
index 79648b9..ec43dd3 100644
--- a/lib/label/hints.c
+++ b/lib/label/hints.c
@@ -625,7 +625,8 @@ static int _read_hint_file(struct cmd_context *cmd, struct dm_list *hints, int *
char devpath[PATH_MAX];
FILE *fp;
struct dev_iter *iter;
- struct hint *hint;
+ struct hint hint;
+ struct hint *alloc_hint;
struct device *dev;
char *split[HINT_LINE_WORDS];
char *name, *pvid, *devn, *vgname, *p, *filter_str = NULL;
@@ -649,11 +650,7 @@ static int _read_hint_file(struct cmd_context *cmd, struct dm_list *hints, int *
split[i] = NULL;
while (fgets(_hint_line, sizeof(_hint_line), fp)) {
- if (!(hint = zalloc(sizeof(struct hint)))) {
- ret = 0;
- break;
- }
-
+ memset(&hint, 0, sizeof(hint));
if (_hint_line[0] == '#')
continue;
@@ -751,19 +748,28 @@ static int _read_hint_file(struct cmd_context *cmd, struct dm_list *hints, int *
vgname = split[3];
if (name && !strncmp(name, "scan:", 5))
- strncpy(hint->name, name+5, PATH_MAX);
+ if (!dm_strncpy(hint.name, name + 5, sizeof(hint.name)))
+ continue;
if (pvid && !strncmp(pvid, "pvid:", 5))
- strncpy(hint->pvid, pvid+5, ID_LEN);
+ if (!dm_strncpy(hint.pvid, pvid + 5, sizeof(hint.pvid)))
+ continue;
if (devn && sscanf(devn, "devn:%d:%d", &major, &minor) == 2)
- hint->devt = makedev(major, minor);
+ hint.devt = makedev(major, minor);
if (vgname && (strlen(vgname) > 3) && (vgname[4] != '-'))
- strncpy(hint->vgname, vgname+3, NAME_LEN);
+ if (!dm_strncpy(hint.vgname, vgname + 3, sizeof(hint.vgname)))
+ continue;
+
+ if (!(alloc_hint = malloc(sizeof(struct hint)))) {
+ ret = 0;
+ break;
+ }
+ memcpy(alloc_hint, &hint, sizeof(hint));
- log_debug("add hint %s %s %d:%d %s", hint->name, hint->pvid, major, minor, vgname);
- dm_list_add(hints, &hint->list);
+ log_debug("add hint %s %s %d:%d %s", hint.name, hint.pvid, major, minor, vgname);
+ dm_list_add(hints, &alloc_hint->list);
found++;
}
4 years, 5 months
master - hints: rewrite function
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=70fb31b5d6863248b5a...
Commit: 70fb31b5d6863248b5adfb2581b706cbb158b30e
Parent: 1f4968289c9c0e2a1e850317ef173df11938b7f3
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 17:15:18 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
hints: rewrite function
---
lib/label/hints.c | 39 +++++++++++++--------------------------
1 files changed, 13 insertions(+), 26 deletions(-)
diff --git a/lib/label/hints.c b/lib/label/hints.c
index 6510fcf..79648b9 100644
--- a/lib/label/hints.c
+++ b/lib/label/hints.c
@@ -586,42 +586,29 @@ static void _filter_to_str(struct cmd_context *cmd, int filter_cfg, char **strp)
char *str;
int pos = 0;
int len = 0;
- int ret;
*strp = NULL;
- if (!(cn = find_config_tree_array(cmd, filter_cfg, NULL))) {
+ if (!(cn = find_config_tree_array(cmd, filter_cfg, NULL)))
/* shouldn't happen because default is a|*| */
return;
- }
-
- for (cv = cn->v; cv; cv = cv->next) {
- if (cv->type != DM_CFG_STRING)
- continue;
- len += (strlen(cv->v.str) + 1);
- }
- len++;
-
- if (len == 1) {
- /* shouldn't happen because default is a|*| */
- return;
- }
+ for (cv = cn->v; cv; cv = cv->next)
+ if (cv->type == DM_CFG_STRING)
+ len += strlen(cv->v.str) + 1;
- if (!(str = malloc(len)))
+ if (!len++ || !(str = malloc(len)))
return;
- memset(str, 0, len);
-
- for (cv = cn->v; cv; cv = cv->next) {
- if (cv->type != DM_CFG_STRING)
- continue;
- ret = snprintf(str + pos, len - pos, "%s", cv->v.str);
+ for (cv = cn->v; cv; cv = cv->next)
+ if (cv->type == DM_CFG_STRING) {
+ len = strlen(cv->v.str);
+ memcpy(str + pos, cv->v.str, len);
+ pos += len;
+ str[pos++] = 0;
+ }
- if (ret >= len - pos)
- break;
- pos += ret;
- }
+ str[pos] = 0;
*strp = str;
}
4 years, 5 months
master - pvck: check result of dev_get_size
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=1f4968289c9c0e2a1e8...
Commit: 1f4968289c9c0e2a1e850317ef173df11938b7f3
Parent: d67ce9e140b5691a3f75a69d6e735eec30603670
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 17:32:22 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
pvck: check result of dev_get_size
Don't use garbage value for later computations.
---
tools/pvck.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/tools/pvck.c b/tools/pvck.c
index c197a97..c9692b0 100644
--- a/tools/pvck.c
+++ b/tools/pvck.c
@@ -1468,7 +1468,8 @@ static int _dump_search(struct cmd_context *cmd,
uint64_t dev_bytes;
uint64_t extra_bytes;
- dev_get_size(dev, &dev_sectors);
+ if (!dev_get_size(dev, &dev_sectors))
+ return_ECMD_FAILED;
dev_bytes = dev_sectors * 512;
extra_bytes = dev_bytes % ONE_MB_IN_BYTES;
4 years, 5 months
master - cov: fix mem leaking buffer
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d67ce9e140b5691a3f7...
Commit: d67ce9e140b5691a3f75a69d6e735eec30603670
Parent: 0bad3977df40a70c68778ff0514d0ca712fee402
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 17:27:14 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
cov: fix mem leaking buffer
Free allocated buffer on function's exit.
Also check for fwrite() results.
---
tools/pvck.c | 36 ++++++++++++++++++++++--------------
1 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/tools/pvck.c b/tools/pvck.c
index 1c1bbc2..c197a97 100644
--- a/tools/pvck.c
+++ b/tools/pvck.c
@@ -662,20 +662,25 @@ static int _dump_meta_area(struct device *dev, const char *tofile,
if (!dev_read_bytes(dev, mda_offset, mda_size, meta_buf)) {
log_print("CHECK: failed to read metadata area at offset %llu size %llu",
(unsigned long long)mda_offset, (unsigned long long)mda_size);
+ free(meta_buf);
return 0;
}
if (!(fp = fopen(tofile, "wx"))) {
- log_error("Failed to create file %s", tofile);
+ log_error("Failed to create file %s.", tofile);
+ free(meta_buf);
return 0;
}
- fwrite(meta_buf, mda_size - 512, 1, fp);
+ if (fwrite(meta_buf, mda_size - 512, 1, fp) < (mda_size - 512))
+ log_warn("WARNING: Failed to write " FMTu64 " bytes to file %s.", mda_size - 512, tofile);
+ free(meta_buf);
if (fflush(fp))
stack;
if (fclose(fp))
stack;
+
return 1;
}
@@ -724,7 +729,7 @@ static int _dump_current_text(struct device *dev,
* mda_offset + meta_offset.
*/
if (meta_offset + meta_size > mda_size) {
- /* text metadata wraps to start of text metadata area */
+ /* text metadata wraps to start of text metadata area */
uint32_t wrap = (uint32_t) ((meta_offset + meta_size) - mda_size);
off_t offset_a = mda_offset + meta_offset;
uint32_t size_a = meta_size - wrap;
@@ -735,6 +740,7 @@ static int _dump_current_text(struct device *dev,
log_print("CHECK: failed to read metadata text at mda_header_%d.raw_locn[%d].offset %llu size %llu part_a %llu %llu", mn, ri,
(unsigned long long)meta_offset, (unsigned long long)meta_size,
(unsigned long long)offset_a, (unsigned long long)size_a);
+ free(meta_buf);
return 0;
}
@@ -742,12 +748,14 @@ static int _dump_current_text(struct device *dev,
log_print("CHECK: failed to read metadata text at mda_header_%d.raw_locn[%d].offset %llu size %llu part_b %llu %llu", mn, ri,
(unsigned long long)meta_offset, (unsigned long long)meta_size,
(unsigned long long)offset_b, (unsigned long long)size_b);
+ free(meta_buf);
return 0;
}
} else {
if (!dev_read_bytes(dev, mda_offset + meta_offset, meta_size, meta_buf)) {
log_print("CHECK: failed to read metadata text at mda_header_%d.raw_locn[%d].offset %llu size %llu", mn, ri,
(unsigned long long)meta_offset, (unsigned long long)meta_size);
+ free(meta_buf);
return 0;
}
}
@@ -805,9 +813,9 @@ static int _dump_current_text(struct device *dev,
}
out:
- if (bad)
- return 0;
- return 1;
+ free(meta_buf);
+
+ return (!bad) ? 1 : 0;
}
static int _dump_label_and_pv_header(struct cmd_context *cmd, int print_fields,
@@ -851,6 +859,7 @@ static int _dump_label_and_pv_header(struct cmd_context *cmd, int print_fields,
if (!dev_read_bytes(dev, lh_offset, 512, buf)) {
log_print("CHECK: failed to read label_header at %llu",
(unsigned long long)lh_offset);
+ free(buf);
return 0;
}
@@ -1045,9 +1054,9 @@ static int _dump_label_and_pv_header(struct cmd_context *cmd, int print_fields,
(unsigned long long)xlate64(dlocn->size));
}
- if (bad)
- return 0;
- return 1;
+ free(buf);
+
+ return (!bad) ? 1 : 0;
}
/*
@@ -1100,6 +1109,7 @@ static int _dump_mda_header(struct cmd_context *cmd,
if (!dev_read_bytes(dev, mda_offset, 512, buf)) {
log_print("CHECK: failed to read mda_header at %llu", (unsigned long long)mda_offset);
+ free(buf);
return 0;
}
@@ -1190,11 +1200,9 @@ static int _dump_mda_header(struct cmd_context *cmd,
/* Should we also check text metadata if it exists in rlocn1? */
out:
- if (buf)
- free(buf);
- if (bad)
- return 0;
- return 1;
+ free(buf);
+
+ return (!bad) ? 1 : 0;
}
static int _dump_headers(struct cmd_context *cmd,
4 years, 5 months
master - cov: avoid passing NULL to strstr function
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=0bad3977df40a70c687...
Commit: 0bad3977df40a70c68778ff0514d0ca712fee402
Parent: 153e55c20e9a3810a1862314a6465179e1b53931
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 17:13:02 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
cov: avoid passing NULL to strstr function
When 'str1' would be NULL, there is no point to run 2nd. strstr().
---
tools/pvck.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/tools/pvck.c b/tools/pvck.c
index 79fb8fb..1c1bbc2 100644
--- a/tools/pvck.c
+++ b/tools/pvck.c
@@ -420,11 +420,11 @@ static int _dump_all_text(struct cmd_context *cmd, const char *tofile, struct de
memset(line, 0, sizeof(line));
_copy_line(str1, line, &len);
log_print("%s", line);
- }
- if ((str2 = strstr(str1, "creation_time = "))) {
- memset(line, 0, sizeof(line));
- _copy_line(str2, line, &len);
- log_print("%s\n", line);
+ if ((str2 = strstr(str1, "creation_time = "))) {
+ memset(line, 0, sizeof(line));
+ _copy_line(str2, line, &len);
+ log_print("%s\n", line);
+ }
}
}
4 years, 5 months
master - cov: check for retvalue
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=153e55c20e9a3810a18...
Commit: 153e55c20e9a3810a1862314a6465179e1b53931
Parent: 44bf9c9a6af2d76d4de04b456362abd4ed454ff9
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Nov 14 17:12:44 2019 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100
cov: check for retvalue
---
tools/pvck.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/tools/pvck.c b/tools/pvck.c
index 231faf9..79fb8fb 100644
--- a/tools/pvck.c
+++ b/tools/pvck.c
@@ -359,7 +359,10 @@ static int _dump_all_text(struct cmd_context *cmd, const char *tofile, struct de
continue;
}
- sscanf(line, "seqno = %u", &seqno);
+ if (sscanf(line, "seqno = %u", &seqno) != 1) {
+ log_warn("WARNING: Failed to parse seqno.");
+ seqno = 0; /* Skip? */
+ }
/*
* The first three lines look like metadata with
4 years, 5 months