Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3e7e297 authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

DataLoader cleanup: return plain FD from Java.

Bug: b/153874006
Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest
Change-Id: I669c5a2fb4777053555522f0f9c0a2449469e467
parent ea1390ff
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -217,7 +217,7 @@ public class PackageManagerShellCommandDataLoader extends DataLoaderService {
                        case Metadata.LOCAL_FILE: {
                            ParcelFileDescriptor incomingFd = null;
                            try {
                                incomingFd = getLocalFile(shellCommand, metadata.getData());
                                incomingFd = getLocalFilePFD(shellCommand, metadata.getData());
                                mConnector.writeData(file.getName(), 0, incomingFd.getStatSize(),
                                        incomingFd);
                            } finally {
@@ -263,10 +263,20 @@ public class PackageManagerShellCommandDataLoader extends DataLoaderService {
        }
    }

    static ParcelFileDescriptor getLocalFile(ShellCommand shellCommand, String filePath) {
    static ParcelFileDescriptor getLocalFilePFD(ShellCommand shellCommand, String filePath) {
        return shellCommand.openFileForSystem(filePath, "r");
    }

    static int getStdIn(ShellCommand shellCommand) {
        ParcelFileDescriptor pfd = getStdInPFD(shellCommand);
        return pfd == null ? -1 : pfd.detachFd();
    }

    static int getLocalFile(ShellCommand shellCommand, String filePath) {
        ParcelFileDescriptor pfd = getLocalFilePFD(shellCommand, filePath);
        return pfd == null ? -1 : pfd.detachFd();
    }

    @Override
    public DataLoaderService.DataLoader onCreateDataLoader(
            @NonNull DataLoaderParams dataLoaderParams) {
+12 −51
Original line number Diff line number Diff line
@@ -69,14 +69,9 @@ static constexpr auto PollTimeoutMs = 5000;
struct JniIds {
    jclass packageManagerShellCommandDataLoader;
    jmethodID pmscdLookupShellCommand;
    jmethodID pmscdGetStdInPFD;
    jmethodID pmscdGetStdIn;
    jmethodID pmscdGetLocalFile;

    jmethodID parcelFileDescriptorGetFileDescriptor;

    jclass ioUtils;
    jmethodID ioUtilsCloseQuietly;

    JniIds(JNIEnv* env) {
        packageManagerShellCommandDataLoader = (jclass)env->NewGlobalRef(
                FindClassOrDie(env, "com/android/server/pm/PackageManagerShellCommandDataLoader"));
@@ -84,23 +79,11 @@ struct JniIds {
                GetStaticMethodIDOrDie(env, packageManagerShellCommandDataLoader,
                                       "lookupShellCommand",
                                       "(Ljava/lang/String;)Landroid/os/ShellCommand;");
        pmscdGetStdInPFD =
                GetStaticMethodIDOrDie(env, packageManagerShellCommandDataLoader, "getStdInPFD",
                                       "(Landroid/os/ShellCommand;)Landroid/os/"
                                       "ParcelFileDescriptor;");
        pmscdGetStdIn = GetStaticMethodIDOrDie(env, packageManagerShellCommandDataLoader,
                                               "getStdIn", "(Landroid/os/ShellCommand;)I");
        pmscdGetLocalFile =
                GetStaticMethodIDOrDie(env, packageManagerShellCommandDataLoader, "getLocalFile",
                                       "(Landroid/os/ShellCommand;Ljava/lang/String;)Landroid/os/"
                                       "ParcelFileDescriptor;");

        auto parcelFileDescriptor = FindClassOrDie(env, "android/os/ParcelFileDescriptor");
        parcelFileDescriptorGetFileDescriptor =
                GetMethodIDOrDie(env, parcelFileDescriptor, "getFileDescriptor",
                                 "()Ljava/io/FileDescriptor;");

        ioUtils = (jclass)env->NewGlobalRef(FindClassOrDie(env, "libcore/io/IoUtils"));
        ioUtilsCloseQuietly = GetStaticMethodIDOrDie(env, ioUtils, "closeQuietly",
                                                     "(Ljava/lang/AutoCloseable;)V");
                                       "(Landroid/os/ShellCommand;Ljava/lang/String;)I");
    }
};

@@ -211,22 +194,6 @@ static inline IncFsSize verityTreeSizeForFile(IncFsSize fileSize) {
    return total_tree_block_count * INCFS_DATA_FILE_BLOCK_SIZE;
}

static inline unique_fd convertPfdToFdAndDup(JNIEnv* env, const JniIds& jni, jobject pfd) {
    if (!pfd) {
        ALOGE("Missing In ParcelFileDescriptor.");
        return {};
    }
    auto managedFd = env->CallObjectMethod(pfd, jni.parcelFileDescriptorGetFileDescriptor);
    if (!pfd) {
        ALOGE("Missing In FileDescriptor.");
        return {};
    }
    unique_fd result{dup(jniGetFDFromFileDescriptor(env, managedFd))};
    // Can be closed after dup.
    env->CallStaticVoidMethod(jni.ioUtils, jni.ioUtilsCloseQuietly, pfd);
    return result;
}

enum MetadataMode : int8_t {
    STDIN = 0,
    LOCAL_FILE = 1,
@@ -263,11 +230,9 @@ static inline InputDescs openLocalFile(JNIEnv* env, const JniIds& jni, jobject s

    const std::string idsigPath = filePath + ".idsig";

    auto idsigFd = convertPfdToFdAndDup(
            env, jni,
            env->CallStaticObjectMethod(jni.packageManagerShellCommandDataLoader,
    unique_fd idsigFd{env->CallStaticIntMethod(jni.packageManagerShellCommandDataLoader,
                                               jni.pmscdGetLocalFile, shellCommand,
                                        env->NewStringUTF(idsigPath.c_str())));
                                               env->NewStringUTF(idsigPath.c_str()))};
    if (idsigFd.ok()) {
        auto treeSize = verityTreeSizeForFile(size);
        auto actualTreeSize = skipIdSigHeaders(idsigFd);
@@ -283,11 +248,9 @@ static inline InputDescs openLocalFile(JNIEnv* env, const JniIds& jni, jobject s
        });
    }

    auto fileFd = convertPfdToFdAndDup(
            env, jni,
            env->CallStaticObjectMethod(jni.packageManagerShellCommandDataLoader,
    unique_fd fileFd{env->CallStaticIntMethod(jni.packageManagerShellCommandDataLoader,
                                              jni.pmscdGetLocalFile, shellCommand,
                                        env->NewStringUTF(filePath.c_str())));
                                              env->NewStringUTF(filePath.c_str()))};
    if (fileFd.ok()) {
        result.push_back(InputDesc{
                .fd = std::move(fileFd),
@@ -307,10 +270,8 @@ static inline InputDescs openInputs(JNIEnv* env, const JniIds& jni, jobject shel
                             std::string(metadata.data, metadata.size));
    }

    auto fd = convertPfdToFdAndDup(
            env, jni,
            env->CallStaticObjectMethod(jni.packageManagerShellCommandDataLoader,
                                        jni.pmscdGetStdInPFD, shellCommand));
    unique_fd fd{env->CallStaticIntMethod(jni.packageManagerShellCommandDataLoader,
                                          jni.pmscdGetStdIn, shellCommand)};
    if (!fd.ok()) {
        return {};
    }