CR: TKON-7FF9XE Fix for corruption of escaped URLs in sdp file

<[email protected]>
Newsgroups gmane.comp.multimedia.helix.devel
Message-ID <[email protected]>
			"Nokia submits this code under the terms of a
commercial contribution agreement with RealNetworks, and I am authorized
to contribute this code under said agreement."
			 
			Modified by:  [email protected]
			 
			Reviewed by: 
			TSW Id: TKON-7FF9XE
			Synergy change Id: ou1cimx1#18877
			Date: 08/21/2008
			 
			Project: SymbianMmf_rel
			 
			Synopsis: Fix for corruption of escaped URLs in
sdp file  

			Overview:
			Control URLs with escaped characters are being
corrupted in the case of streaming from an sdp file. 

			The sdp file contains the following URL:
	
rtsp://195.92.254.27:554/owtv007?fg=2&ud=msisdn%3D447973261756%2Csubscri
ptionId%3D77657%2CmmServiceId%3D64436&dt=20080723T183555.000Z&ds=9a4cde8
ea60e54d5f9adc7cb23fcf7bccaa1899a

			But what helix sends out in the SETUP request is
this:
	
rtsp://195.92.254.27:554/owtv007?fg=2&ud=msisdn=447973261756,subscriptio
nId=77657,mmServiceId=64436&dt=20080723T183555.000Z&ds=9a4cde8ea60e54d5f
9adc7cb23fcf7bccaa1899a

			The difference between the two is that reserved
characters are un-escaped by helix in the value of this "key=value"
pair:
			In SDP file: 
	
ud=msisdn%3D447973261756%2CsubscriptionId%3D77657%2CmmServiceId%3D64436
			After Helix un-escapes: 
	
ud=msisdn=447973261756,subscriptionId=77657,mmServiceId=64436

			This happens because:
			1. We first escape the entire SDP file in
HXFileSource::GetFileDone()
			2. Then we un-escape it in
HXNetSource::FinishSetup() -> This is when the "=" and "," characters
			in question are un-escaped.
			3. Then we escape the URL again in
RTSPClientProtocol::InitExtInitSDP() by calling
HXEscapeUtil::EnsureEscapedURL(), but this doesn't return the URL to its
original form. The reason why the "=" and "," characters are not escaped
here is because the entire query (the part after ?) is treated as one
string where reserved characters (';', '/', '?', ':', '@', '&', '=',
'+', '$', ',', '\0') do not need to be escaped. Given a query string
with no escaped characters, helix would not be able to reconstruct the
original percent-encoded query in all cases. 

			Fix:
			Make sure that characters are double-escaped
when the sdp file is initially escaped.

			1. After escaping the sdp file, the URL would
become:
	
rtsp://195.92.254.27:554/owtv007?fg=2&ud=msisdn%253D447973261756%252Csub
	
scriptionId%253D77657%252CmmServiceId%253D64436&dt=20080723T183555.000Z&
			ds=9a4cde8ea60e54d5f9adc7cb23fcf7bccaa1899a

			2. After unescaping the sdp file, the URL would
go back to its original form:
	
rtsp://195.92.254.27:554/owtv007?fg=2&ud=msisdn%3D447973261756%2Csubscri
	
ptionId%3D77657%2CmmServiceId%3D64436&dt=20080723T183555.000Z&ds=9a4cde8
			ea60e54d5f9adc7cb23fcf7bccaa1899a

			3. Finally, after escaping the URL (with the
idempotent version of the escape function, as we usually do, not
escaping already escaped characters), we still get back the original
URL:
	
rtsp://195.92.254.27:554/owtv007?fg=2&ud=msisdn%3D447973261756%2Csubscri
	
ptionId%3D77657%2CmmServiceId%3D64436&dt=20080723T183555.000Z&ds=9a4cde8
			ea60e54d5f9adc7cb23fcf7bccaa1899a


			Files modified & changes:
			/client/core/hxflsrc.cpp
			/common/util/hxescapeutil.cpp
			/common/util/pub/hxescapeutil.h


			Image Size and Heap Use impact: None

			Module Release testing (STIF) : Passed
(Streaming)

			Test case(s) Added  : No.
							
			Memory leak check performed : Passed, No leaks
found
			  
			Platforms and Profiles Build Verified:
helix-client-s60-32-mmf-mdf-arm

			Platforms and Profiles Functionality verified:
armv5
			  
			Branch: Head, 210CayS, 221Cays


Index: hxflsrc.cpp
===================================================================
RCS file: /cvsroot/client/core/hxflsrc.cpp,v
retrieving revision 1.96.2.7.2.2
diff -u -w -r1.96.2.7.2.2 hxflsrc.cpp
--- hxflsrc.cpp 6 May 2008 22:55:51 -0000       1.96.2.7.2.2
+++ hxflsrc.cpp 21 Aug 2008 20:00:05 -0000
@@ -3575,7 +3575,11 @@
     memset(pszSDPBuffer, 0, ulSDPBufferSize);
     strncpy(pszSDPBuffer, (const char*)pFile->GetBuffer(),
pFile->GetSize());

-    escapedSDP = HXEscapeUtil::EscapeGeneric(pszSDPBuffer);
+    // Allowing double-escape of characters in sdp file so it can be
restored
+    // to its original form when it's unescaped in
HXNetSource::FinishSetup().
+    // If this is not done, any URL in the sdp file that contains
escaped
+    //  characters will be corrupted
+    escapedSDP = HXEscapeUtil::EscapeGeneric(pszSDPBuffer, true);

     url = HELIX_SDP_SCHEME;
     url += ":";


Index: hxescapeutil.cpp
===================================================================
RCS file: /cvsroot/common/util/hxescapeutil.cpp,v
retrieving revision 1.2.42.1
diff -u -w -r1.2.42.1 hxescapeutil.cpp
--- hxescapeutil.cpp    2 May 2006 19:47:31 -0000       1.2.42.1
+++ hxescapeutil.cpp    21 Aug 2008 20:00:54 -0000
@@ -171,7 +171,7 @@
     return newStr.Finish();
 }

-static CHXString Escape(const CHXString& unescapedStr, const char*
pExtra = 0)
+static CHXString Escape(const CHXString& unescapedStr, const char*
pExtra = 0, const bool doubleEscape = false)
 {
     int len = unescapedStr.GetLength();
     const char* pCur = unescapedStr;
@@ -181,7 +181,7 @@
     while (len)
     {
        if (IsSpecialChar(*pCur, pExtra) &&
-           !IsEscaped(pCur,len))
+        (!IsEscaped(pCur,len) || doubleEscape))
        {
            // Escape this character
            *newPath = '%';
@@ -320,9 +320,9 @@
 }

 // escape everything but unreserved characters
-CHXString HXEscapeUtil::EscapeGeneric(const CHXString& unescapedQuery)
+CHXString HXEscapeUtil::EscapeGeneric(const CHXString& unescapedQuery,
const bool doubleEscape)
 {
-    return Escape(unescapedQuery);
+    return Escape(unescapedQuery, NULL, doubleEscape);
 }

 // escape symbol by doubling, e.g., '%' -> '%%'


Index: hxescapeutil.h
===================================================================
RCS file: /cvsroot/common/util/pub/hxescapeutil.h,v
retrieving revision 1.2
diff -u -w -r1.2 hxescapeutil.h
--- hxescapeutil.h      15 Dec 2004 21:26:28 -0000      1.2
+++ hxescapeutil.h      21 Aug 2008 20:02:12 -0000
@@ -27,7 +27,7 @@
 static CHXString UnEscape(const CHXString& escapedStr);

 // encode (used when assembling url components into a full URL)
-static CHXString EscapeGeneric(const CHXString& unescapedStr);
+static CHXString EscapeGeneric(const CHXString& unescapedStr, const
bool doubleEscape = false);
 static CHXString EscapePath(const CHXString& unescapedPath, bool
bForcePlusEscape = false);
 static CHXString EscapeQuery(const CHXString& unescapedQuery);


Regards,
Gaby

_______________________________________________
Helix-client-dev mailing list
[email protected]
http://lists.helixcommunity.org/mailman/listinfo/helix-client-dev
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.