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

Commit 84ae607b authored by Andreas Gampe's avatar Andreas Gampe Committed by android-build-merger
Browse files

Merge "Otapreopt: Introduce protocol version 10" am: 26311df4 am: 076b5c7a

am: 7690741e

Change-Id: I36083c7251159deb43e18fe885fa4c27c88f9e73
parents 1e896cad 7690741e
Loading
Loading
Loading
Loading
+13 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,8 @@


#include "otapreopt_parameters.h"
#include "otapreopt_parameters.h"


#include <cstring>

#include <android-base/logging.h>
#include <android-base/logging.h>


#include "dexopt.h"
#include "dexopt.h"
@@ -248,6 +250,8 @@ bool OTAPreoptParameters::ReadArgumentsPostV1(uint32_t version, const char** arg
        case 8: num_args_expected = 16; break;
        case 8: num_args_expected = 16; break;
        // Version 9 adds a new dexopt flag: DEXOPT_GENERATE_APP_IMAGE
        // Version 9 adds a new dexopt flag: DEXOPT_GENERATE_APP_IMAGE
        case 9: num_args_expected = 16; break;
        case 9: num_args_expected = 16; break;
        // Version 10 is a compatibility bump.
        case 10: num_args_expected = 16; break;
        default:
        default:
            LOG(ERROR) << "Don't know how to read arguments for version " << version;
            LOG(ERROR) << "Don't know how to read arguments for version " << version;
            return false;
            return false;
@@ -360,6 +364,15 @@ bool OTAPreoptParameters::ReadArgumentsPostV1(uint32_t version, const char** arg
        }
        }
    }
    }


    if (version < 10) {
        // Do not accept '&' as shared libraries from versions prior to 10. These may lead
        // to runtime crashes. The server side of version 10+ should send the correct
        // context in almost all cases (e.g., only for actual shared packages).
        if (shared_libraries != nullptr && std::string("&") == shared_libraries) {
            return false;
        }
    }

    return true;
    return true;
}
}


+21 −4
Original line number Original line Diff line number Diff line
@@ -114,11 +114,14 @@ protected:
            case 7: return "7";
            case 7: return "7";
            case 8: return "8";
            case 8: return "8";
            case 9: return "9";
            case 9: return "9";
            case 10: return "10";
        }
        }
        return nullptr;
        return nullptr;
    }
    }


    std::vector<const char*> getArgs(uint32_t version, bool versioned) {
    std::vector<const char*> getArgs(uint32_t version,
                                     bool versioned,
                                     const char* shared_libs = "shared.lib") {
        std::vector<const char*> args;
        std::vector<const char*> args;
        args.push_back("otapreopt");  // "otapreopt"
        args.push_back("otapreopt");  // "otapreopt"
        args.push_back("a");  // slot
        args.push_back("a");  // slot
@@ -135,7 +138,7 @@ protected:
        args.push_back("0");  // dexopt_flags
        args.push_back("0");  // dexopt_flags
        args.push_back("speed");  // filter
        args.push_back("speed");  // filter
        args.push_back("!");  // volume
        args.push_back("!");  // volume
        args.push_back("shared.lib");  // libs
        args.push_back(shared_libs);  // libs


        if (version > 1) {
        if (version > 1) {
            args.push_back("!");  // seinfo
            args.push_back("!");  // seinfo
@@ -159,9 +162,11 @@ protected:
        return args;
        return args;
    }
    }


    void VerifyReadArguments(uint32_t version, bool versioned) {
    void VerifyReadArguments(uint32_t version,
                             bool versioned,
                             const char* shared_libs = "shared.lib") {
        OTAPreoptParameters params;
        OTAPreoptParameters params;
        std::vector<const char*> args = getArgs(version, versioned);
        std::vector<const char*> args = getArgs(version, versioned, shared_libs);
        ASSERT_TRUE(params.ReadArguments(args.size() - 1, args.data()));
        ASSERT_TRUE(params.ReadArguments(args.size() - 1, args.data()));
        verifyPackageParameters(params, version, versioned, args.data());
        verifyPackageParameters(params, version, versioned, args.data());
    }
    }
@@ -199,6 +204,18 @@ TEST_F(OTAPreoptTest, ReadArgumentsV7) {
    VerifyReadArguments(7, true);
    VerifyReadArguments(7, true);
}
}


TEST_F(OTAPreoptTest, ReadArgumentsV9SharedLibsAmpersand) {
    OTAPreoptParameters params;
    std::vector<const char*> args = getArgs(9, true, "&");
    ASSERT_FALSE(params.ReadArguments(args.size() - 1, args.data()));
}

TEST_F(OTAPreoptTest, ReadArgumentsV10SharedLibsAmpersand) {
    OTAPreoptParameters params;
    std::vector<const char*> args = getArgs(10, true, "&");
    ASSERT_TRUE(params.ReadArguments(args.size() - 1, args.data()));
}

TEST_F(OTAPreoptTest, ReadArgumentsFailToManyArgs) {
TEST_F(OTAPreoptTest, ReadArgumentsFailToManyArgs) {
    OTAPreoptParameters params;
    OTAPreoptParameters params;
    std::vector<const char*> args = getArgs(5, true);
    std::vector<const char*> args = getArgs(5, true);