diff --git a/examples/cc26xx/cc26xx-web-demo/httpd-simple.c b/examples/cc26xx/cc26xx-web-demo/httpd-simple.c
index e23e78efe..168294088 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,30 @@ url_unescape(const char *src, size_t srclen, char *dst, size_t dstlen)
return i == srclen;
}
/*---------------------------------------------------------------------------*/
+static char*
+html_escape_quotes(const char *src)
+{
+ memset(html_escaped_buf, 0, HTML_ESCAPED_BUFFER_SIZE);
+ size_t dstpos = 0;
+ for(size_t i = 0; i < HTML_ESCAPED_BUFFER_SIZE; i++) {
+ if(src[i] == '\0') {
+ break;
+ } else if(src[i] == '"') {
+ if(dstpos + 6 > HTML_ESCAPED_BUFFER_SIZE) {
+ break;
+ }
+
+ strcpy(&html_escaped_buf[dstpos], """);
+ dstpos += 6;
+ } else {
+ html_escaped_buf[dstpos++] = src[i];
+ }
+ }
+
+ 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 +703,8 @@ 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)));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "name=\"type_id\">%s", config_div_close));
@@ -687,7 +716,8 @@ 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)));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "name=\"org_id\">%s", config_div_close));
@@ -711,7 +741,8 @@ 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)));
PT_WAIT_THREAD(&s->generate_pt,
enqueue_chunk(s, 0, "name=\"cmd_type\">%s",
config_div_close));
@@ -724,7 +755,8 @@ 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)));
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..c54b856fb 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)
@@ -356,7 +359,14 @@ ip_addr_post_handler(char *key, int key_len, char *val, int val_len)
return HTTPD_SIMPLE_POST_HANDLER_UNKNOWN;
}
- if(val_len > MQTT_CLIENT_CONFIG_IP_ADDR_STR_LEN) {
+ /*
+ * 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(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 {