# HG changeset patch
# User Deanna Earley <dee.earley@icode.co.uk>
# Date 1425556330 0
#      Thu Mar 05 11:52:10 2015 +0000
# Node ID eabbb8c78f997c500a6b6375d07f8268f0341697
# Parent  0d25fa0a39b365682603989a3a7d3e70af2d8a12
Correctly decoded special characters in the username and password in the RTSP URL (bug #2235)

diff -r 0d25fa0a39b3 -r eabbb8c78f99 liveMedia/RTSPClient.cpp
--- a/liveMedia/RTSPClient.cpp	Tue Feb 24 16:02:06 2015 +0000
+++ b/liveMedia/RTSPClient.cpp	Thu Mar 05 11:52:10 2015 +0000
@@ -243,14 +243,30 @@
 	char const* usernameStart = from;
 	unsigned usernameLen = colonPasswordStart - usernameStart;
 	username = new char[usernameLen + 1] ; // allow for the trailing '\0'
-	for (unsigned i = 0; i < usernameLen; ++i) username[i] = usernameStart[i];
+	for (unsigned is = 0, id = 0; id < usernameLen; ++is, ++id) {
+		if (usernameStart[is] == '%' && id < usernameLen - 2) {
+			sscanf(&usernameStart[is + 1], "%2hhx", &username[id]);
+			is += 2;
+			usernameLen -= 2;
+		} else {
+			username[id] = usernameStart[is];
+		}
+	}
 	username[usernameLen] = '\0';
 
 	char const* passwordStart = colonPasswordStart;
 	if (passwordStart < p) ++passwordStart; // skip over the ':'
 	unsigned passwordLen = p - passwordStart;
 	password = new char[passwordLen + 1]; // allow for the trailing '\0'
-	for (unsigned j = 0; j < passwordLen; ++j) password[j] = passwordStart[j];
+	for (unsigned js = 0, jd = 0; jd < passwordLen; ++js, ++jd) {
+		if (passwordStart[js] == '%' && jd < passwordLen - 2) {
+			sscanf(&passwordStart[js + 1], "%2hhx", &password[jd]);
+			js += 2;
+			passwordLen -= 2;
+		} else {
+			password[jd] = passwordStart[js];
+		}
+	}
 	password[passwordLen] = '\0';
 
 	from = p + 1; // skip over the '@'
