summaryrefslogtreecommitdiffstats
path: root/libdm
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2012-02-15 12:17:34 +0000
committerPeter Rajnoha <prajnoha@redhat.com>2012-02-15 12:17:34 +0000
commit3eb23ab3d26925ec84308afa23080a77ef3333f7 (patch)
tree8fd5555b00f4879e56209987aab4e70f0b223db9 /libdm
parent4491acea0b09816e244c29a7f18592e3d3737e26 (diff)
downloadlvm2-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"
Diffstat (limited to 'libdm')
-rw-r--r--libdm/ioctl/libdm-iface.c25
1 files changed, 22 insertions, 3 deletions
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);