New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 745870 link

Starred by 1 user

Issue metadata

Status: Fixed
Owner: ----
Closed: Jul 2017
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Android
Pri: 2
Type: Bug



Sign in to add a comment

JavaUrlRequest has leak and/or race related to OutputStreamDataSink

Project Member Reported by pauljensen@chromium.org, Jul 18 2017

Issue description

While running on an x86 emulator with Android API level 24 I saw this while running CronetUrlRequestTest.testUploadWithBadLengthBufferAligned

07-18 06:54:57.154  6884  6893 E StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
07-18 06:54:57.154  6884  6893 E StrictMode: java.lang.Throwable: Explicit termination method 'close' not called
07-18 06:54:57.154  6884  6893 E StrictMode: 	at dalvik.system.CloseGuard.open(CloseGuard.java:180)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at java.net.AbstractPlainSocketImpl.create(AbstractPlainSocketImpl.java:103)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at java.net.Socket.createImpl(Socket.java:451)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at java.net.Socket.getImpl(Socket.java:517)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at java.net.Socket.setSoTimeout(Socket.java:1108)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at com.android.okhttp.Connection.connectSocket(Connection.java:195)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at com.android.okhttp.Connection.connect(Connection.java:172)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at org.chromium.net.impl.JavaUrlRequest$OutputStreamDataSink$3.run(JavaUrlRequest.java:415)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at org.chromium.net.impl.JavaUrlRequest$8.run(JavaUrlRequest.java:702)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at org.chromium.net.impl.JavaUrlRequest$SerializingExecutor$1.run(JavaUrlRequest.java:141)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at org.chromium.net.impl.JavaUrlRequest$1$1.run(JavaUrlRequest.java:204)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at org.chromium.net.impl.JavaCronetEngine$1$1.run(JavaCronetEngine.java:58)
07-18 06:54:57.154  6884  6893 E StrictMode: 	at java.lang.Thread.run(Thread.java:761)
07-18 06:54:57.154  6884  6893 W System.err: StrictMode VmPolicy violation with POLICY_DEATH; shutting down.

I think HttpURLConnection.disconnect() is being properly called as per  Issue 726193 , but after some digging I saw this comment:
"It's the caller's responsibility to close the request body and response body streams; otherwise resources may be leaked."
http://androidxref.com/7.0.0_r1/xref/external/okhttp/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java#563

Looks like JavaUrlRequest.OutputStreamDataSink.mOutputChannel (which wraps the uploads stream) is not closed when enterUploadErrorState() is called.

This code is quite tricky, e.g. finish() is called from different threads, and enterUploadErrorState() is called from outside JavaUrlRequest.OutputStreamDataSink so doesn't have access to mOutputChannel.
 
Project Member

Comment 1 by bugdroid1@chromium.org, Jul 19 2017

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/e4be4c00197b24f8d0c471da9e087b5646a9d7f5

commit e4be4c00197b24f8d0c471da9e087b5646a9d7f5
Author: Paul Jensen <pauljensen@google.com>
Date: Wed Jul 19 20:46:09 2017

[Cronet] Fix leak of JavaUrlRequest.OutputStreamDataSink.mOutputChannel

When disconnecting the main HttpURLConnection, close the OutputStream if
it has not yet been closed (e.g. when enterUploadErrorState() is called).

BUG= 745870 

Change-Id: I16930d0b3dd17d8d17c36e90cd5c1fe8d6f86964
Reviewed-on: https://chromium-review.googlesource.com/575275
Commit-Queue: Miriam Gershenson <mgersh@chromium.org>
Reviewed-by: Miriam Gershenson <mgersh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487967}
[modify] https://crrev.com/e4be4c00197b24f8d0c471da9e087b5646a9d7f5/components/cronet/android/java/src/org/chromium/net/impl/JavaUrlRequest.java

Status: Fixed (was: Available)

Sign in to add a comment