Skip to content

Commit 98d6575

Browse files
committed
MT#55283 add (un)escape parser methods
Change-Id: I7d9be892c4b5a3e28b77bc4a42e4c0cee722a132
1 parent 348e4e2 commit 98d6575

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

daemon/control_ng.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,15 @@ static str json_collapse(ng_parser_ctx_t *ctx, JsonNode *a, void **to_free) {
440440
static void json_ctx_init(ng_parser_ctx_t *ctx, bencode_buffer_t *buf) {
441441
*ctx = (ng_parser_ctx_t) { .parser = &ng_parser_json };
442442
}
443+
static str dummy_encode_len(char *out, const char *in, size_t in_len) {
444+
return STR_LEN(in, in_len);
445+
}
446+
static str *dummy_decode_len(const char *in, size_t len) {
447+
str *r = str_alloc(len);
448+
memcpy(r->s, in, len);
449+
r->s[len] = '\0';
450+
return r;
451+
}
443452

444453
const ng_parser_t ng_parser_native = {
445454
.init = __bencode_ctx_init,
@@ -474,6 +483,8 @@ const ng_parser_t ng_parser_native = {
474483
.list_add_string = bencode_list_add_string,
475484
.list_add_str_dup = bencode_list_add_str_dup,
476485
.pretty_print = bencode_pretty_print,
486+
.escape = dummy_encode_len,
487+
.unescape = dummy_decode_len,
477488
};
478489
const ng_parser_t ng_parser_json = {
479490
.init = json_ctx_init,
@@ -508,6 +519,8 @@ const ng_parser_t ng_parser_json = {
508519
.list_add_string = json_list_add_string,
509520
.list_add_str_dup = json_list_add_str,
510521
.pretty_print = json_pretty_print,
522+
.escape = str_uri_encode_len,
523+
.unescape = str_uri_decode_len,
511524
};
512525

513526

daemon/redis.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,7 +1023,7 @@ static void json_get_hash_iter(const ng_parser_t *parser, str *key, parser_arg v
10231023
char *tmp = __g_memdup(key->s, key->len + 1);
10241024
tmp[key->len] = '\0';
10251025
// XXX eliminate string dup? eliminate URI decode?
1026-
if (g_hash_table_insert(arg.ht, tmp, str_uri_decode_len(val.s, val.len)) != TRUE)
1026+
if (g_hash_table_insert(arg.ht, tmp, parser->unescape(val.s, val.len)) != TRUE)
10271027
rlog(LOG_WARNING,"Key %s already exists", tmp);
10281028
}
10291029

@@ -1191,7 +1191,7 @@ struct cb_iter_ptrs { // XXX remove this?
11911191

11921192
static void json_build_list_cb_iter(str *val, unsigned int i, helper_arg arg) {
11931193
struct cb_iter_ptrs *args = arg.generic;
1194-
str *s = str_uri_decode_len(val->s, val->len);
1194+
str *s = redis_parser->unescape(val->s, val->len);
11951195
args->cb(s, args->cb_arg, args->list, args->ptr);
11961196
g_free(s);
11971197
}
@@ -2310,32 +2310,32 @@ int redis_restore(struct redis *r, bool foreign, int db) {
23102310
#define JSON_ADD_LIST_STRING(f,...) do { \
23112311
int len = snprintf(tmp,sizeof(tmp), f, __VA_ARGS__); \
23122312
char enc[len * 3 + 1]; \
2313-
str encstr = str_uri_encode_len(enc, tmp, len); \
2313+
str encstr = parser->escape(enc, tmp, len); \
23142314
parser->list_add_str_dup(inner, &encstr); \
23152315
} while (0)
23162316
#define JSON_SET_NSTRING(a,b,c,...) do { \
23172317
int len = snprintf(tmp,sizeof(tmp), c, __VA_ARGS__); \
23182318
char enc[len * 3 + 1]; \
2319-
str encstr = str_uri_encode_len(enc, tmp, len); \
2319+
str encstr = parser->escape(enc, tmp, len); \
23202320
snprintf(tmp,sizeof(tmp), a,b); \
23212321
parser->dict_add_str_dup(inner, tmp, &encstr); \
23222322
} while (0)
23232323
#define JSON_SET_NSTRING_CSTR(a,b,d) JSON_SET_NSTRING_LEN(a, b, strlen(d), d)
23242324
#define JSON_SET_NSTRING_LEN(a,b,l,d) do { \
23252325
char enc[l * 3 + 1]; \
2326-
str encstr = str_uri_encode_len(enc, d, l); \
2326+
str encstr = parser->escape(enc, d, l); \
23272327
snprintf(tmp,sizeof(tmp), a,b); \
23282328
parser->dict_add_str_dup(inner, tmp, &encstr); \
23292329
} while (0)
23302330
#define JSON_SET_SIMPLE(a,c,...) do { \
23312331
int len = snprintf(tmp,sizeof(tmp), c, __VA_ARGS__); \
23322332
char enc[len * 3 + 1]; \
2333-
str encstr = str_uri_encode_len(enc, tmp, len); \
2333+
str encstr = parser->escape(enc, tmp, len); \
23342334
parser->dict_add_str_dup(inner, a, &encstr); \
23352335
} while (0)
23362336
#define JSON_SET_SIMPLE_LEN(a,l,d) do { \
23372337
char enc[l * 3 + 1]; \
2338-
str encstr = str_uri_encode_len(enc, d, l); \
2338+
str encstr = parser->escape(enc, d, l); \
23392339
parser->dict_add_str_dup(inner, a, &encstr); \
23402340
} while (0)
23412341
#define JSON_SET_SIMPLE_CSTR(a,d) parser->dict_add_str_dup(inner, a, &STR(d))

include/control_ng.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ struct ng_parser {
155155
void (*list_add_str_dup)(parser_arg, const str *);
156156
void (*list_add_string)(parser_arg , const char *);
157157
void (*pretty_print)(parser_arg, GString *);
158+
str (*escape)(char *, const char *, size_t);
159+
str *(*unescape)(const char *, size_t);
158160
};
159161
struct ng_parser_ctx {
160162
const ng_parser_t *parser;

0 commit comments

Comments
 (0)