diff --git a/examples/cc26xx/cc26xx-web-demo/httpd-simple.c b/examples/cc26xx/cc26xx-web-demo/httpd-simple.c
index e23e78efe..17f62f0d7 100644
--- a/examples/cc26xx/cc26xx-web-demo/httpd-simple.c
+++ b/examples/cc26xx/cc26xx-web-demo/httpd-simple.c
@@ -137,6 +137,10 @@ PROCESS(httpd_simple_process, "CC26XX Web Server");
#define REQUEST_TYPE_GET 1
#define REQUEST_TYPE_POST 2
/*---------------------------------------------------------------------------*/
+/* Temporary buffer for holding escaped HTML used by html_escape_quotes */
+#define HTML_ESCAPED_BUFFER_SIZE 128
+static char html_escaped_buf[HTML_ESCAPED_BUFFER_SIZE];
+/*---------------------------------------------------------------------------*/
static const char *NOT_FOUND = "
"
""
"404 - file not found
"
@@ -305,6 +309,31 @@ url_unescape(const char *src, size_t srclen, char *dst, size_t dstlen)
return i == srclen;
}
/*---------------------------------------------------------------------------*/
+static char*
+html_escape_quotes(const char *src, size_t srclen)
+{
+ size_t srcpos, dstpos;
+ memset(html_escaped_buf, 0, HTML_ESCAPED_BUFFER_SIZE);
+ for(srcpos = dstpos = 0;
+ srcpos < srclen && dstpos < HTML_ESCAPED_BUFFER_SIZE - 1; srcpos++) {
+ if(src[srcpos] == '\0') {
+ break;
+ } else if(src[srcpos] == '"') {
+ if(dstpos + 7 > HTML_ESCAPED_BUFFER_SIZE) {
+ break;
+ }
+
+ strcpy(&html_escaped_buf[dstpos], """);
+ dstpos += 6;
+ } else {
+ html_escaped_buf[dstpos++] = src[srcpos];
+ }
+ }
+
+ html_escaped_buf[HTML_ESCAPED_BUFFER_SIZE - 1] = '\0';
+ return html_escaped_buf;
+}
+/*---------------------------------------------------------------------------*/
void
httpd_simple_register_post_handler(httpd_simple_post_handler_t *h)
{
@@ -675,7 +704,9 @@ PT_THREAD(generate_mqtt_config(struct httpd_state *s))
config_div_right));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "value=\"%s\" ",
- cc26xx_web_demo_config.mqtt_config.type_id));
+ html_escape_quotes(
+ cc26xx_web_demo_config.mqtt_config.type_id,
+ MQTT_CLIENT_CONFIG_TYPE_ID_LEN)));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "name=\"type_id\">%s", config_div_close));
@@ -687,7 +718,9 @@ PT_THREAD(generate_mqtt_config(struct httpd_state *s))
config_div_right));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "value=\"%s\" ",
- cc26xx_web_demo_config.mqtt_config.org_id));
+ html_escape_quotes(
+ cc26xx_web_demo_config.mqtt_config.org_id,
+ MQTT_CLIENT_CONFIG_ORG_ID_LEN)));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "name=\"org_id\">%s", config_div_close));
@@ -711,7 +744,9 @@ PT_THREAD(generate_mqtt_config(struct httpd_state *s))
config_div_right));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "value=\"%s\" ",
- cc26xx_web_demo_config.mqtt_config.cmd_type));
+ html_escape_quotes(
+ cc26xx_web_demo_config.mqtt_config.cmd_type,
+ MQTT_CLIENT_CONFIG_CMD_TYPE_LEN)));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "name=\"cmd_type\">%s",
config_div_close));
@@ -724,7 +759,9 @@ PT_THREAD(generate_mqtt_config(struct httpd_state *s))
config_div_right));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "value=\"%s\" ",
- cc26xx_web_demo_config.mqtt_config.event_type_id));
+ html_escape_quotes(
+ cc26xx_web_demo_config.mqtt_config.event_type_id,
+ MQTT_CLIENT_CONFIG_EVENT_TYPE_ID_LEN)));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "name=\"event_type_id\">%s",
config_div_close));
diff --git a/examples/cc26xx/cc26xx-web-demo/mqtt-client.c b/examples/cc26xx/cc26xx-web-demo/mqtt-client.c
index e45378264..d3f3c0207 100644
--- a/examples/cc26xx/cc26xx-web-demo/mqtt-client.c
+++ b/examples/cc26xx/cc26xx-web-demo/mqtt-client.c
@@ -64,6 +64,9 @@
*/
static const char *broker_ip = "0064:ff9b:0000:0000:0000:0000:b8ac:7cbd";
/*---------------------------------------------------------------------------*/
+#define ADDRESS_CONVERSION_OK 1
+#define ADDRESS_CONVERSION_ERROR 0
+/*---------------------------------------------------------------------------*/
/*
* A timeout used when waiting for something to happen (e.g. to connect or to
* disconnect)
@@ -350,13 +353,20 @@ ip_addr_post_handler(char *key, int key_len, char *val, int val_len)
{
int rv = HTTPD_SIMPLE_POST_HANDLER_UNKNOWN;
+ /*
+ * uiplib_ip6addrconv will immediately start writing into the supplied buffer
+ * even if it subsequently fails. Thus, pass an intermediate buffer
+ */
+ uip_ip6addr_t tmp_addr;
+
if(key_len != strlen("broker_ip") ||
strncasecmp(key, "broker_ip", strlen("broker_ip")) != 0) {
/* Not ours */
return HTTPD_SIMPLE_POST_HANDLER_UNKNOWN;
}
- if(val_len > MQTT_CLIENT_CONFIG_IP_ADDR_STR_LEN) {
+ if(val_len > MQTT_CLIENT_CONFIG_IP_ADDR_STR_LEN
+ || uiplib_ip6addrconv(val, &tmp_addr) != ADDRESS_CONVERSION_OK) {
/* Ours but bad value */
rv = HTTPD_SIMPLE_POST_HANDLER_ERROR;
} else {