OSDN Git Service

Fix two SIGSEGV bugs in request interception.
authorJeff Sharkey <jsharkey@android.com>
Fri, 17 Dec 2010 04:31:13 +0000 (20:31 -0800)
committerJeff Sharkey <jsharkey@android.com>
Fri, 17 Dec 2010 04:32:05 +0000 (20:32 -0800)
When intercepting requests, properly ReleaseStringUTFChars for mimeType
and encoding after bringing over from Java.  Also, when finishing an
intercepted request that failed, construct a valid WebResponse.

Change-Id: I2990df2108a8fdf45c103512a8b9a30f4d6992ce

WebKit/android/WebCoreSupport/UrlInterceptResponse.cpp
WebKit/android/WebCoreSupport/WebRequest.cpp

index 1126609..875b222 100644 (file)
@@ -102,14 +102,14 @@ UrlInterceptResponse::UrlInterceptResponse(JNIEnv* env, jobject response) {
     jstring encodingStr = (jstring) env->GetObjectField(response, encoding);
 
     if (mimeStr) {
-        m_mimeType.assign(env->GetStringUTFChars(mimeStr, NULL),
-                          env->GetStringUTFLength(mimeStr));
-        env->ReleaseStringUTFChars(mimeStr, NULL);
+        const char* s = env->GetStringUTFChars(mimeStr, NULL);
+        m_mimeType.assign(s, env->GetStringUTFLength(mimeStr));
+        env->ReleaseStringUTFChars(mimeStr, s);
     }
     if (encodingStr) {
-        m_encoding.assign(env->GetStringUTFChars(encodingStr, NULL),
-                          env->GetStringUTFLength(encodingStr));
-        env->ReleaseStringUTFChars(encodingStr, NULL);
+        const char* s = env->GetStringUTFChars(encodingStr, NULL);
+        m_encoding.assign(s, env->GetStringUTFLength(encodingStr));
+        env->ReleaseStringUTFChars(encodingStr, s);
     }
 
     env->DeleteLocalRef(javaResponse);
index cd496df..da84126 100644 (file)
@@ -120,9 +120,16 @@ void WebRequest::finish(bool success)
         m_urlLoader->maybeCallOnMainThread(NewRunnableMethod(
                 m_urlLoader.get(), &WebUrlLoaderClient::didFinishLoading));
     } else {
-        OwnPtr<WebResponse> webResponse(new WebResponse(m_request.get()));
-        m_urlLoader->maybeCallOnMainThread(NewRunnableMethod(
-                m_urlLoader.get(), &WebUrlLoaderClient::didFail, webResponse.release()));
+        if (m_interceptResponse == NULL) {
+            OwnPtr<WebResponse> webResponse(new WebResponse(m_request.get()));
+            m_urlLoader->maybeCallOnMainThread(NewRunnableMethod(
+                    m_urlLoader.get(), &WebUrlLoaderClient::didFail, webResponse.release()));
+        } else {
+            OwnPtr<WebResponse> webResponse(new WebResponse(m_url, m_interceptResponse->mimeType(), 0,
+                    m_interceptResponse->encoding(), m_interceptResponse->status()));
+            m_urlLoader->maybeCallOnMainThread(NewRunnableMethod(
+                    m_urlLoader.get(), &WebUrlLoaderClient::didFail, webResponse.release()));
+        }
     }
     m_networkBuffer = 0;
     m_request = 0;