!12 lcr: encode some escape charactors of lxc config file string
Merge pull request !12 from gaohuatao/master
This commit is contained in:
commit
a8479d341b
@ -739,11 +739,71 @@ out:
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// escape_string_encode unzip some escape characters
|
||||||
|
static char *escape_string_encode(const char *src)
|
||||||
|
{
|
||||||
|
size_t src_end = 0;
|
||||||
|
size_t dst_end = 0;
|
||||||
|
size_t len = 0;
|
||||||
|
char *dst = NULL;
|
||||||
|
|
||||||
|
if (src == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = strlen(src);
|
||||||
|
if (len == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst = util_common_calloc_s(2 * len + 1);
|
||||||
|
if (dst == NULL) {
|
||||||
|
ERROR("Out of memory");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (src_end < len) {
|
||||||
|
switch (src[src_end++]) {
|
||||||
|
case '\r':
|
||||||
|
dst[dst_end++] = '\\';
|
||||||
|
dst[dst_end++] = 'r';
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
dst[dst_end++] = '\\';
|
||||||
|
dst[dst_end++] = 'n';
|
||||||
|
break;
|
||||||
|
case '\f':
|
||||||
|
dst[dst_end++] = '\\';
|
||||||
|
dst[dst_end++] = 'f';
|
||||||
|
break;
|
||||||
|
case '\b':
|
||||||
|
dst[dst_end++] = '\\';
|
||||||
|
dst[dst_end++] = 'b';
|
||||||
|
break;
|
||||||
|
case '\t':
|
||||||
|
dst[dst_end++] = '\\';
|
||||||
|
dst[dst_end++] = 't';
|
||||||
|
break;
|
||||||
|
case '\\':
|
||||||
|
dst[dst_end++] = '\\';
|
||||||
|
dst[dst_end++] = '\\';
|
||||||
|
break;
|
||||||
|
// default do not encode
|
||||||
|
default:
|
||||||
|
dst[dst_end++] = src[src_end - 1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
static int lcr_spec_write_config(int fd, const struct lcr_list *lcr_conf)
|
static int lcr_spec_write_config(int fd, const struct lcr_list *lcr_conf)
|
||||||
{
|
{
|
||||||
struct lcr_list *it = NULL;
|
struct lcr_list *it = NULL;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
|
char *line_encode = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
lcr_list_for_each(it, lcr_conf) {
|
lcr_list_for_each(it, lcr_conf) {
|
||||||
@ -765,21 +825,30 @@ static int lcr_spec_write_config(int fd, const struct lcr_list *lcr_conf)
|
|||||||
ERROR("Sprintf failed");
|
ERROR("Sprintf failed");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if ((size_t)nret > len - 1) {
|
|
||||||
nret = (int)(len - 1);
|
line_encode = escape_string_encode(line);
|
||||||
|
if (line_encode == NULL) {
|
||||||
|
ERROR("String encode failed");
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
line[nret] = '\n';
|
|
||||||
if (write(fd, line, len) == -1) {
|
nret = strlen(line_encode);
|
||||||
|
|
||||||
|
line_encode[nret] = '\n';
|
||||||
|
if (write(fd, line_encode, nret + 1) == -1) {
|
||||||
SYSERROR("Write failed");
|
SYSERROR("Write failed");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
free(line);
|
free(line);
|
||||||
line = NULL;
|
line = NULL;
|
||||||
|
free(line_encode);
|
||||||
|
line_encode = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
free(line);
|
free(line);
|
||||||
|
free(line_encode);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user