cheets: Delegate openAppFuseFile operation to vold

Bug: 72017414, 110379912
Test: testOpenProxyFileDescriptor passes

Change-Id: I6e0302e9f043836857e16bbe76d4bb927ccae784
This commit is contained in:
Ryo Hashimoto
2018-05-16 18:20:37 +09:00
committed by Risan
parent 2c0da88382
commit 70ee4328cd
2 changed files with 25 additions and 22 deletions

View File

@@ -2602,24 +2602,35 @@ class StorageManagerService extends IStorageManager.Stub
class AppFuseMountScope extends AppFuseBridge.MountScope {
boolean opened = false;
public AppFuseMountScope(int uid, int pid, int mountId) {
super(uid, pid, mountId);
public AppFuseMountScope(int uid, int mountId) {
super(uid, mountId);
}
@Override
public ParcelFileDescriptor open() throws NativeDaemonConnectorException {
try {
return new ParcelFileDescriptor(
mVold.mountAppFuse(uid, Process.myPid(), mountId));
mVold.mountAppFuse(uid, mountId));
} catch (Exception e) {
throw new NativeDaemonConnectorException("Failed to mount", e);
}
}
@Override
public ParcelFileDescriptor openFile(int mountId, int fileId, int flags)
throws NativeDaemonConnectorException {
try {
return new ParcelFileDescriptor(
mVold.openAppFuseFile(uid, mountId, fileId, flags));
} catch (Exception e) {
throw new NativeDaemonConnectorException("Failed to open", e);
}
}
@Override
public void close() throws Exception {
if (opened) {
mVold.unmountAppFuse(uid, Process.myPid(), mountId);
mVold.unmountAppFuse(uid, mountId);
opened = false;
}
}
@@ -2629,7 +2640,6 @@ class StorageManagerService extends IStorageManager.Stub
public @Nullable AppFuseMount mountProxyFileDescriptorBridge() {
Slog.v(TAG, "mountProxyFileDescriptorBridge");
final int uid = Binder.getCallingUid();
final int pid = Binder.getCallingPid();
while (true) {
synchronized (mAppFuseLock) {
@@ -2643,7 +2653,7 @@ class StorageManagerService extends IStorageManager.Stub
final int name = mNextAppFuseName++;
try {
return new AppFuseMount(
name, mAppFuseBridge.addBridge(new AppFuseMountScope(uid, pid, name)));
name, mAppFuseBridge.addBridge(new AppFuseMountScope(uid, name)));
} catch (FuseUnavailableMountException e) {
if (newlyCreated) {
// If newly created bridge fails, it's a real error.
@@ -2664,14 +2674,13 @@ class StorageManagerService extends IStorageManager.Stub
public @Nullable ParcelFileDescriptor openProxyFileDescriptor(
int mountId, int fileId, int mode) {
Slog.v(TAG, "mountProxyFileDescriptor");
final int pid = Binder.getCallingPid();
try {
synchronized (mAppFuseLock) {
if (mAppFuseBridge == null) {
Slog.e(TAG, "FuseBridge has not been created");
return null;
}
return mAppFuseBridge.openFile(pid, mountId, fileId, mode);
return mAppFuseBridge.openFile(mountId, fileId, mode);
}
} catch (FuseUnavailableMountException | InterruptedException error) {
Slog.v(TAG, "The mount point has already been invalid", error);

View File

@@ -16,6 +16,7 @@
package com.android.server.storage;
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
import android.system.ErrnoException;
import android.system.Os;
@@ -25,8 +26,6 @@ import com.android.internal.os.FuseUnavailableMountException;
import com.android.internal.util.Preconditions;
import com.android.server.NativeDaemonConnectorException;
import libcore.io.IoUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.concurrent.CountDownLatch;
/**
@@ -87,7 +86,7 @@ public class AppFuseBridge implements Runnable {
}
}
public ParcelFileDescriptor openFile(int pid, int mountId, int fileId, int mode)
public ParcelFileDescriptor openFile(int mountId, int fileId, int mode)
throws FuseUnavailableMountException, InterruptedException {
final MountScope scope;
synchronized (this) {
@@ -96,17 +95,14 @@ public class AppFuseBridge implements Runnable {
throw new FuseUnavailableMountException(mountId);
}
}
if (scope.pid != pid) {
throw new SecurityException("PID does not match");
}
final boolean result = scope.waitForMount();
if (result == false) {
throw new FuseUnavailableMountException(mountId);
}
try {
return ParcelFileDescriptor.open(
new File(scope.mountPoint, String.valueOf(fileId)), mode);
} catch (FileNotFoundException error) {
int flags = FileUtils.translateModePfdToPosix(mode);
return scope.openFile(mountId, fileId, flags);
} catch (NativeDaemonConnectorException error) {
throw new FuseUnavailableMountException(mountId);
}
}
@@ -131,17 +127,13 @@ public class AppFuseBridge implements Runnable {
public static abstract class MountScope implements AutoCloseable {
public final int uid;
public final int pid;
public final int mountId;
public final File mountPoint;
private final CountDownLatch mMounted = new CountDownLatch(1);
private boolean mMountResult = false;
public MountScope(int uid, int pid, int mountId) {
public MountScope(int uid, int mountId) {
this.uid = uid;
this.pid = pid;
this.mountId = mountId;
this.mountPoint = new File(String.format(APPFUSE_MOUNT_NAME_TEMPLATE, uid, mountId));
}
@GuardedBy("AppFuseBridge.this")
@@ -159,6 +151,8 @@ public class AppFuseBridge implements Runnable {
}
public abstract ParcelFileDescriptor open() throws NativeDaemonConnectorException;
public abstract ParcelFileDescriptor openFile(int mountId, int fileId, int flags)
throws NativeDaemonConnectorException;
}
private native long native_new();