aboutsummaryrefslogtreecommitdiff
path: root/www/firefox35/files/patch-CAN-2005-2871
blob: eca8515adbdbdea62cab3c17da8ff175e1c0d6bc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Index: netwerk/base/src/nsStandardURL.cpp
===================================================================
RCS file: /cvs/mozilla/netwerk/base/src/nsStandardURL.cpp,v
retrieving revision 1.60.16.2
diff -p -u -1 -2 -r1.60.16.2 nsStandardURL.cpp
--- netwerk/base/src/nsStandardURL.cpp	17 Feb 2005 23:40:53 -0000	1.60.16.2
+++ netwerk/base/src/nsStandardURL.cpp	9 Sep 2005 16:34:46 -0000
@@ -403,24 +403,25 @@ nsStandardURL::AppendToBuf(char *buf, PR
 //  4- update url segment positions and lengths
 nsresult
 nsStandardURL::BuildNormalizedSpec(const char *spec)
 {
     // Assumptions: all member URLSegments must be relative the |spec| argument
     // passed to this function.
 
     // buffers for holding escaped url segments (these will remain empty unless
     // escaping is required).
     nsCAutoString encUsername;
     nsCAutoString encPassword;
     nsCAutoString encHost;
+    PRBool useEncHost;
     nsCAutoString encDirectory;
     nsCAutoString encBasename;
     nsCAutoString encExtension;
     nsCAutoString encParam;
     nsCAutoString encQuery;
     nsCAutoString encRef;
 
     //
     // escape each URL segment, if necessary, and calculate approximate normalized
     // spec length.
     //
     PRInt32 approxLen = 3; // includes room for "://"
@@ -440,34 +441,36 @@ nsStandardURL::BuildNormalizedSpec(const
         approxLen += encoder.EncodeSegmentCount(spec, mBasename,  esc_FileBaseName,  encBasename);
         approxLen += encoder.EncodeSegmentCount(spec, mExtension, esc_FileExtension, encExtension);
         approxLen += encoder.EncodeSegmentCount(spec, mParam,     esc_Param,         encParam);
         approxLen += encoder.EncodeSegmentCount(spec, mQuery,     esc_Query,         encQuery);
         approxLen += encoder.EncodeSegmentCount(spec, mRef,       esc_Ref,           encRef);
     }
 
     // do not escape the hostname, if IPv6 address literal, mHost will
     // already point to a [ ] delimited IPv6 address literal.
     // However, perform Unicode normalization on it, as IDN does.
     mHostEncoding = eEncoding_ASCII;
     if (mHost.mLen > 0) {
+        useEncHost = PR_FALSE;
         const nsCSubstring& tempHost =
             Substring(spec + mHost.mPos, spec + mHost.mPos + mHost.mLen);
         if (IsASCII(tempHost))
             approxLen += mHost.mLen;
         else {
             mHostEncoding = eEncoding_UTF8;
             if (gIDNService &&
-                NS_SUCCEEDED(gIDNService->Normalize(tempHost, encHost)))
+                NS_SUCCEEDED(gIDNService->Normalize(tempHost, encHost))) {
                 approxLen += encHost.Length();
-            else {
+                useEncHost = PR_TRUE;
+            } else {
                 encHost.Truncate();
                 approxLen += mHost.mLen;
             }
         }
     }
 
     //
     // generate the normalized URL string
     //
     mSpec.SetLength(approxLen + 32);
     char *buf;
     mSpec.BeginWriting(buf);
@@ -483,25 +486,30 @@ nsStandardURL::BuildNormalizedSpec(const
     mAuthority.mPos = i;
 
     // append authority
     if (mUsername.mLen > 0) {
         i = AppendSegmentToBuf(buf, i, spec, mUsername, &encUsername);
         if (mPassword.mLen >= 0) {
             buf[i++] = ':';
             i = AppendSegmentToBuf(buf, i, spec, mPassword, &encPassword);
         }
         buf[i++] = '@';
     }
     if (mHost.mLen > 0) {
-        i = AppendSegmentToBuf(buf, i, spec, mHost, &encHost);
+        if (useEncHost) {
+            mHost.mPos = i;
+            mHost.mLen = encHost.Length();
+            i = AppendToBuf(buf, i, encHost.get(), mHost.mLen);
+        } else
+            i = AppendSegmentToBuf(buf, i, spec, mHost);
         net_ToLowerCase(buf + mHost.mPos, mHost.mLen);
         if (mPort != -1 && mPort != mDefaultPort) {
             nsCAutoString portbuf;
             portbuf.AppendInt(mPort);
             buf[i++] = ':';
             i = AppendToBuf(buf, i, portbuf.get(), portbuf.Length());
         }
     }
 
     // record authority length
     mAuthority.mLen = i - mAuthority.mPos;