summaryrefslogtreecommitdiff
path: root/tools/vgimportclone.c
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2018-02-09 17:06:30 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2018-02-12 22:14:22 +0100
commitd94036f8ed412457f2044f0b36aebe24f7fcc707 (patch)
tree8163427fab1c70fabe3ad0f106e66517fef92522 /tools/vgimportclone.c
parent60b61f2db3d6e98329213e11b65581ea1ee080a5 (diff)
downloadlvm2-d94036f8ed412457f2044f0b36aebe24f7fcc707.tar.gz
vgimportclone: add some dm_snprintf checks
Check if the generated vg name still fits the buffer. So too long strings are rejected. Drop -1 from size passed to snprintf - as the \0 is already included.
Diffstat (limited to 'tools/vgimportclone.c')
-rw-r--r--tools/vgimportclone.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/tools/vgimportclone.c b/tools/vgimportclone.c
index 1f86ad66c..146d3b4bf 100644
--- a/tools/vgimportclone.c
+++ b/tools/vgimportclone.c
@@ -283,12 +283,22 @@ int vgimportclone(struct cmd_context *cmd, int argc, char **argv)
*/
if (arg_is_set(cmd, basevgname_ARG)) {
- snprintf(base_vgname, sizeof(base_vgname) - 1, "%s", arg_str_value(cmd, basevgname_ARG, ""));
- memcpy(tmp_vgname, base_vgname, NAME_LEN);
+ vgname = arg_str_value(cmd, basevgname_ARG, "");
+ if (dm_snprintf(base_vgname, sizeof(base_vgname), "%s", vgname) < 0) {
+ log_error("Base vg name %s is too long.", vgname);
+ goto out;
+ }
+ (void) dm_strncpy(tmp_vgname, base_vgname, NAME_LEN);
vgname_count = 0;
} else {
- snprintf(base_vgname, sizeof(base_vgname) - 1, "%s", vp.old_vgname);
- snprintf(tmp_vgname, sizeof(tmp_vgname) - 1, "%s1", vp.old_vgname);
+ if (dm_snprintf(base_vgname, sizeof(base_vgname), "%s", vp.old_vgname) < 0) {
+ log_error(INTERNAL_ERROR "Old vg name %s is too long.", vp.old_vgname);
+ goto out;
+ }
+ if (dm_snprintf(tmp_vgname, sizeof(tmp_vgname), "%s1", vp.old_vgname) < 0) {
+ log_error("Temporary vg name %s1 is too long.", vp.old_vgname);
+ goto out;
+ }
vgname_count = 1;
}
@@ -299,7 +309,10 @@ retry_name:
dm_list_iterate_items(vgnl, &vgnameids_on_system) {
if (!strcmp(vgnl->vg_name, tmp_vgname)) {
vgname_count++;
- snprintf(tmp_vgname, sizeof(tmp_vgname) - 1, "%s%u", base_vgname, vgname_count);
+ if (dm_snprintf(tmp_vgname, sizeof(tmp_vgname), "%s%u", base_vgname, vgname_count) < 0) {
+ log_error("Failed to generated temporary vg name, %s%u is too long.", base_vgname, vgname_count);
+ goto out;
+ }
goto retry_name;
}
}