diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index b7bad50d3b4e81cf2a97c76a63a4e2eed1c6f24e..a5fe2c1ce3428c56a295340232e93f0fb5f31b77 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2546,16 +2546,20 @@ static int parse_uri(char *uri, char *scheme,
 static int sip_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
 {
 	struct sip_pvt *p = chan->tech_pvt;
-	char *tmp;
-	int debug = sip_debug_test_pvt(p);
+	struct ast_str *buf;
+
 	if (subclass != AST_HTML_URL)
 		return -1;
-	tmp = alloca(strlen(data) + 20);
-	snprintf(tmp, strlen(data) + 20, "<%s>;mode=active", data);
-	p->url = tmp;
-	if (debug)
-		ast_verbose("Send URL %s, state = %d!\n", data, chan->_state);
-	switch(chan->_state) {
+
+	buf = ast_str_alloca(64);
+
+	ast_str_set(&buf, 0, "<%s>;mode=active", data);
+	p->url = buf->str;
+
+	if (sip_debug_test_pvt(p) && option_debug)
+		ast_log(LOG_DEBUG, "Send URL %s, state = %d!\n", data, chan->_state);
+
+	switch (chan->_state) {
 	case AST_STATE_RING:
 		transmit_response(p, "100 Trying", &p->initreq);
 		break;
@@ -2568,15 +2572,17 @@ static int sip_sendhtml(struct ast_channel *chan, int subclass, const char *data
 		} else if (!ast_test_flag(&p->flags[0], SIP_PENDINGBYE)) {
 			/* We have a pending Invite. Send re-invite when we're done with the invite */
 			ast_set_flag(&p->flags[0], SIP_NEEDREINVITE);	
-			p->url = strdup(p->url);
-			p->freeurl = 1;
+			if ((p->url = ast_strdup(p->url)))
+				p->freeurl = 1;
 		}	
 		break;
 	default:
 		ast_log(LOG_WARNING, "Don't know how to send URI when state is %d!\n", chan->_state);
 	}
+
 	if (p->url && !p->freeurl)
 		ast_log(LOG_WARNING, "Whoa, didn't expect URI to hang around!\n");
+
 	return 0;
 }