From fa9d9af754d4a1239a85576bf63dafb103f3a770 Mon Sep 17 00:00:00 2001
From: Russell Bryant <russell@russellbryant.com>
Date: Mon, 23 Apr 2007 18:49:19 +0000
Subject: [PATCH] When building a JSON encoded string in the GetConfigJSON
 manager action, escape the '\' and '"' characters.  (issue #9475, reported by
 pari, patch by me)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@61767 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/manager.c | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/main/manager.c b/main/manager.c
index 94eb202dde..88dba48ee1 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1065,6 +1065,17 @@ static int action_getconfig(struct mansession *s, const struct message *m)
 	return 0;
 }
 
+/*! The amount of space in out must be at least ( 2 * strlen(in) + 1 ) */
+static void json_escape(char *out, const char *in)
+{
+	for (; *in; in++) {
+		if (*in == '\\' || *in == '\"')
+			*out++ = '\\';
+		*out++ = *in;
+	}
+	*out = '\0';
+}
+
 static char mandescr_getconfigjson[] =
 "Description: A 'GetConfigJSON' action will dump the contents of a configuration\n"
 "file by category and contents in JSON format.  This only makes sense to be used\n"
@@ -1079,6 +1090,8 @@ static int action_getconfigjson(struct mansession *s, const struct message *m)
 	char *category = NULL;
 	struct ast_variable *v;
 	int comma1 = 0;
+	char *buf = NULL;
+	unsigned int buf_len = 0;
 
 	if (ast_strlen_zero(fn)) {
 		astman_send_error(s, m, "Filename not specified");
@@ -1090,15 +1103,36 @@ static int action_getconfigjson(struct mansession *s, const struct message *m)
 		return 0;
 	}
 
+	buf_len = 512;
+	buf = alloca(buf_len);
+
 	astman_start_ack(s, m);
 	astman_append(s, "JSON: {");
 	while ((category = ast_category_browse(cfg, category))) {
 		int comma2 = 0;
-		astman_append(s, "%s\"%s\":[", comma1 ? "," : "", category);
+		if (buf_len < 2 * strlen(category) + 1) {
+			buf_len *= 2;
+			buf = alloca(buf_len);
+		}
+		json_escape(buf, category);
+		astman_append(s, "%s\"%s\":[", comma1 ? "," : "", buf);
 		if (!comma1)
 			comma1 = 1;
 		for (v = ast_variable_browse(cfg, category); v; v = v->next) {
-			astman_append(s, "%s\"%s=%s\"", comma2 ? "," : "", v->name, v->value);
+			if (comma2)
+				astman_append(s, ",");
+			if (buf_len < 2 * strlen(v->name) + 1) {
+				buf_len *= 2;
+				buf = alloca(buf_len);
+			}
+			json_escape(buf, v->name);
+			astman_append(s, "\"%s", buf);
+			if (buf_len < 2 * strlen(v->value) + 1) {
+				buf_len *= 2;
+				buf = alloca(buf_len);
+			}
+			json_escape(buf, v->value);
+			astman_append(s, "%s\"", buf);
 			if (!comma2)
 				comma2 = 1;
 		}
-- 
GitLab