Revision 16a06b24 block/rbd.c

b/block/rbd.c
102 102
    *p = NULL;
103 103

  
104 104
    if (delim != '\0') {
105
        end = strchr(src, delim);
106
        if (end) {
105
        for (end = src; *end; ++end) {
106
            if (*end == delim) {
107
                break;
108
            }
109
            if (*end == '\\' && end[1] != '\0') {
110
                end++;
111
            }
112
        }
113
        if (*end == delim) {
107 114
            *p = end + 1;
108 115
            *end = '\0';
109 116
        }
......
122 129
    return 0;
123 130
}
124 131

  
132
static void qemu_rbd_unescape(char *src)
133
{
134
    char *p;
135

  
136
    for (p = src; *src; ++src, ++p) {
137
        if (*src == '\\' && src[1] != '\0') {
138
            src++;
139
        }
140
        *p = *src;
141
    }
142
    *p = '\0';
143
}
144

  
125 145
static int qemu_rbd_parsename(const char *filename,
126 146
                              char *pool, int pool_len,
127 147
                              char *snap, int snap_len,
......
146 166
        ret = -EINVAL;
147 167
        goto done;
148 168
    }
169
    qemu_rbd_unescape(pool);
149 170

  
150 171
    if (strchr(p, '@')) {
151 172
        ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p);
......
153 174
            goto done;
154 175
        }
155 176
        ret = qemu_rbd_next_tok(snap, snap_len, p, ':', "snap name", &p);
177
        qemu_rbd_unescape(snap);
156 178
    } else {
157 179
        ret = qemu_rbd_next_tok(name, name_len, p, ':', "object name", &p);
158 180
    }
181
    qemu_rbd_unescape(name);
159 182
    if (ret < 0 || !p) {
160 183
        goto done;
161 184
    }
......
211 234
        if (ret < 0) {
212 235
            break;
213 236
        }
237
        qemu_rbd_unescape(name);
214 238

  
215 239
        if (!p) {
216 240
            error_report("conf option %s has no value", name);
......
223 247
        if (ret < 0) {
224 248
            break;
225 249
        }
250
        qemu_rbd_unescape(value);
226 251

  
227 252
        if (strcmp(name, "conf") == 0) {
228 253
            ret = rados_conf_read_file(cluster, value);

Also available in: Unified diff