diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2018-02-09 17:06:30 +0100 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2018-02-12 22:14:22 +0100 |
commit | d94036f8ed412457f2044f0b36aebe24f7fcc707 (patch) | |
tree | 8163427fab1c70fabe3ad0f106e66517fef92522 /tools/vgimportclone.c | |
parent | 60b61f2db3d6e98329213e11b65581ea1ee080a5 (diff) | |
download | lvm2-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.c | 23 |
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; } } |