summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2017-02-24 14:17:58 -0600
committerDavid Teigland <teigland@redhat.com>2017-02-24 14:17:58 -0600
commit84cceaf9b9f0f323c78e9818c2b54c97d71b392f (patch)
treec5a691d114b0fe4f15b98c33920505e836550717
parent74ba326007205ebbb5afca7c8f74a8b19e9dcb50 (diff)
downloadlvm2-84cceaf9b9f0f323c78e9818c2b54c97d71b392f.tar.gz
lvconvert: fix handling args in combining snapshots
Fixes commit 286d39ee3c433, which was correct except for a reversed strstr. Now uses strchr, and modifies a copy of the name so the original argv is preserved.
-rw-r--r--tools/lvconvert.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 183421ad2..c82dab2f6 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -3668,8 +3668,9 @@ static int _lvconvert_combine_split_snapshot_single(struct cmd_context *cmd,
int lvconvert_combine_split_snapshot_cmd(struct cmd_context *cmd, int argc, char **argv)
{
const char *vgname = NULL;
- const char *lvname1;
- const char *lvname2;
+ const char *lvname1_orig;
+ const char *lvname2_orig;
+ const char *lvname1_split;
char *vglv;
int vglv_sz;
@@ -3687,20 +3688,25 @@ int lvconvert_combine_split_snapshot_cmd(struct cmd_context *cmd, int argc, char
* This is the only instance in all commands.
*/
- lvname1 = cmd->position_argv[0];
- lvname2 = cmd->position_argv[1];
+ lvname1_orig = cmd->position_argv[0];
+ lvname2_orig = cmd->position_argv[1];
- if (strstr("/", lvname1) && !strstr("/", lvname2) && !getenv("LVM_VG_NAME")) {
- if (!validate_lvname_param(cmd, &vgname, &lvname1))
+ if (strchr(lvname1_orig, '/') && !strchr(lvname2_orig, '/') && !getenv("LVM_VG_NAME")) {
+ if (!(lvname1_split = dm_pool_strdup(cmd->mem, lvname1_orig)))
return_ECMD_FAILED;
- vglv_sz = strlen(vgname) + strlen(lvname2) + 2;
+ if (!validate_lvname_param(cmd, &vgname, &lvname1_split))
+ return_ECMD_FAILED;
+
+ vglv_sz = strlen(vgname) + strlen(lvname2_orig) + 2;
if (!(vglv = dm_pool_alloc(cmd->mem, vglv_sz)) ||
- dm_snprintf(vglv, vglv_sz, "%s/%s", vgname, lvname2) < 0) {
+ dm_snprintf(vglv, vglv_sz, "%s/%s", vgname, lvname2_orig) < 0) {
log_error("vg/lv string alloc failed.");
return_ECMD_FAILED;
}
+ /* vglv is now vgname/lvname2 and replaces lvname2_orig */
+
cmd->position_argv[1] = vglv;
}