diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2012-02-15 12:17:34 +0000 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2012-02-15 12:17:34 +0000 |
commit | 3eb23ab3d26925ec84308afa23080a77ef3333f7 (patch) | |
tree | 8fd5555b00f4879e56209987aab4e70f0b223db9 | |
parent | 4491acea0b09816e244c29a7f18592e3d3737e26 (diff) | |
download | lvm2-3eb23ab3d26925ec84308afa23080a77ef3333f7.tar.gz lvm2-3eb23ab3d26925ec84308afa23080a77ef3333f7.tar.xz lvm2-3eb23ab3d26925ec84308afa23080a77ef3333f7.zip |
Replace any '\' char with '\\' in table specification on input.
Device-mapper in kernel uses '\' as escape character so it's better
to double it to avoid any confusion when using existing device names
with '\' in the table specification.
For example:
dmsetup create x --table "0 8 linear /dev/mapper/a\x20b 0"
should pass just fine now without a need to explicitly escape the '\' char
like this:
dmsetup create x --table "0 8 linear /dev/mapper/a\\x20b 0"
-rw-r--r-- | WHATS_NEW_DM | 1 | ||||
-rw-r--r-- | libdm/ioctl/libdm-iface.c | 25 |
2 files changed, 23 insertions, 3 deletions
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index 719dc478..1103380d 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,6 @@ Version 1.02.71 - ==================================== + Replace any '\' char with '\\' in table specification on input. Add mangle command to dmsetup to provide renaming to correct mangled form. Add 'mangled_name' and 'unmangled_name' fields to dmsetup info -c -o. Add --manglename option to dmsetup to select the name mangling mode. diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c index c5734e33..f6795997 100644 --- a/libdm/ioctl/libdm-iface.c +++ b/libdm/ioctl/libdm-iface.c @@ -866,7 +866,9 @@ static char *_add_target(struct target *t, char *out, char *end) char *out_sp = out; struct dm_target_spec sp; size_t sp_size = sizeof(struct dm_target_spec); + unsigned int backslash_count = 0; int len; + char *pt; if (strlen(t->type) >= sizeof(sp.target_type)) { log_error("Target type name %s is too long.", t->type); @@ -880,15 +882,32 @@ static char *_add_target(struct target *t, char *out, char *end) sp.target_type[sizeof(sp.target_type) - 1] = '\0'; out += sp_size; - len = strlen(t->params); + pt = t->params; + + while (*pt) + if (*pt++ == '\\') + backslash_count++; + len = strlen(t->params) + backslash_count; if ((out >= end) || (out + len + 1) >= end) { log_error("Ran out of memory building ioctl parameter"); return NULL; } - strcpy(out, t->params); - out += len + 1; + if (backslash_count) { + /* replace "\" with "\\" */ + pt = t->params; + do { + if (*pt == '\\') + *out++ = '\\'; + *out++ = *pt++; + } while (*pt); + *out++ = '\0'; + } + else { + strcpy(out, t->params); + out += len + 1; + } /* align next block */ out = _align(out, ALIGNMENT); |