Fix fd leak in KeepaliveTracker.

The semantics of FileDescriptor in AIDL are that the callee must close
the file descriptor it receives manually.

Fix: 157789860
Bug: 155136951
Test: treehugger
Change-Id: Ice9fc9abe2959a84ad138a95c900dff676653665
Merged-In: Ice9fc9abe2959a84ad138a95c900dff676653665
(cherry picked from commit db8ae41da255caad7640fc2c1b58d16aafb0e62b)
This commit is contained in:
Lorenzo Colitti
2020-08-07 06:39:05 +00:00
committed by Junyu Lai
parent 75d9e28a07
commit f5c38386a6

View File

@@ -220,6 +220,8 @@ import com.android.server.utils.PriorityDump;
import com.google.android.collect.Lists; import com.google.android.collect.Lists;
import libcore.io.IoUtils;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@@ -7519,18 +7521,34 @@ public class ConnectivityService extends IConnectivityManager.Stub
public void startNattKeepaliveWithFd(Network network, FileDescriptor fd, int resourceId, public void startNattKeepaliveWithFd(Network network, FileDescriptor fd, int resourceId,
int intervalSeconds, ISocketKeepaliveCallback cb, String srcAddr, int intervalSeconds, ISocketKeepaliveCallback cb, String srcAddr,
String dstAddr) { String dstAddr) {
mKeepaliveTracker.startNattKeepalive( try {
getNetworkAgentInfoForNetwork(network), fd, resourceId, mKeepaliveTracker.startNattKeepalive(
intervalSeconds, cb, getNetworkAgentInfoForNetwork(network), fd, resourceId,
srcAddr, dstAddr, NattSocketKeepalive.NATT_PORT); intervalSeconds, cb,
srcAddr, dstAddr, NattSocketKeepalive.NATT_PORT);
} finally {
// FileDescriptors coming from AIDL calls must be manually closed to prevent leaks.
// startNattKeepalive calls Os.dup(fd) before returning, so we can close immediately.
if (fd != null && Binder.getCallingPid() != Process.myPid()) {
IoUtils.closeQuietly(fd);
}
}
} }
@Override @Override
public void startTcpKeepalive(Network network, FileDescriptor fd, int intervalSeconds, public void startTcpKeepalive(Network network, FileDescriptor fd, int intervalSeconds,
ISocketKeepaliveCallback cb) { ISocketKeepaliveCallback cb) {
enforceKeepalivePermission(); try {
mKeepaliveTracker.startTcpKeepalive( enforceKeepalivePermission();
getNetworkAgentInfoForNetwork(network), fd, intervalSeconds, cb); mKeepaliveTracker.startTcpKeepalive(
getNetworkAgentInfoForNetwork(network), fd, intervalSeconds, cb);
} finally {
// FileDescriptors coming from AIDL calls must be manually closed to prevent leaks.
// startTcpKeepalive calls Os.dup(fd) before returning, so we can close immediately.
if (fd != null && Binder.getCallingPid() != Process.myPid()) {
IoUtils.closeQuietly(fd);
}
}
} }
@Override @Override