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

Commit b216a462 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Pass caller information in cancelBugreport." am: 28a811cb

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1552744

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I7e76a638e0398b8215a75ef75636a68cfee6b239
parents 99204942 28a811cb
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -39,8 +39,13 @@ struct DumpstateInfo {
    std::string calling_package;
};

static binder::Status exception(uint32_t code, const std::string& msg) {
static binder::Status exception(uint32_t code, const std::string& msg,
                                const std::string& extra_msg = "") {
    if (extra_msg.empty()) {
        MYLOGE("%s (%d) ", msg.c_str(), code);
    } else {
        MYLOGE("%s %s (%d) ", msg.c_str(), extra_msg.c_str(), code);
    }
    return binder::Status::fromExceptionCode(code, String8(msg.c_str()));
}

@@ -60,7 +65,7 @@ static binder::Status exception(uint32_t code, const std::string& msg) {

}  // namespace

DumpstateService::DumpstateService() : ds_(nullptr) {
DumpstateService::DumpstateService() : ds_(nullptr), calling_uid_(-1), calling_package_() {
}

char const* DumpstateService::getServiceName() {
@@ -131,6 +136,10 @@ binder::Status DumpstateService::startBugreport(int32_t calling_uid,
    ds_->SetOptions(std::move(options));
    ds_->listener_ = listener;

    // Track caller info for cancellation purposes.
    calling_uid_ = calling_uid;
    calling_package_ = calling_package;

    DumpstateInfo* ds_info = new DumpstateInfo();
    ds_info->ds = ds_;
    ds_info->calling_uid = calling_uid;
@@ -149,8 +158,20 @@ binder::Status DumpstateService::startBugreport(int32_t calling_uid,
    return binder::Status::ok();
}

binder::Status DumpstateService::cancelBugreport() {
binder::Status DumpstateService::cancelBugreport(int32_t calling_uid,
                                                 const std::string& calling_package) {
    std::lock_guard<std::mutex> lock(lock_);
    if (calling_uid != calling_uid_ || calling_package != calling_package_) {
        // Note: we use a SecurityException to prevent BugreportManagerServiceImpl from killing the
        // report in progress (from another caller).
        return exception(
            binder::Status::EX_SECURITY,
            StringPrintf("Cancellation requested by %d/%s does not match report in "
                         "progress",
                         calling_uid, calling_package.c_str()),
            // Sharing the owner of the BR is a (minor) leak, so leave it out of the app's exception
            StringPrintf("started by %d/%s", calling_uid_, calling_package_.c_str()));
    }
    ds_->Cancel();
    return binder::Status::ok();
}
+3 −2
Original line number Diff line number Diff line
@@ -44,8 +44,7 @@ class DumpstateService : public BinderService<DumpstateService>, public BnDumpst
                                  const sp<IDumpstateListener>& listener,
                                  bool is_screenshot_requested) override;

    // No-op
    binder::Status cancelBugreport();
    binder::Status cancelBugreport(int32_t calling_uid, const std::string& calling_package);

  private:
    // Dumpstate object which contains all the bugreporting logic.
@@ -53,6 +52,8 @@ class DumpstateService : public BinderService<DumpstateService>, public BnDumpst
    // one bugreport.
    // This service does not own this object.
    Dumpstate* ds_;
    int32_t calling_uid_;
    std::string calling_package_;
    std::mutex lock_;
};

+15 −8
Original line number Diff line number Diff line
/**
/*
 * Copyright (c) 2016, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
@@ -49,7 +49,7 @@ interface IDumpstate {
    // Default mode.
    const int BUGREPORT_MODE_DEFAULT = 6;

    /*
    /**
     * Starts a bugreport in the background.
     *
     * <p>Shows the user a dialog to get consent for sharing the bugreport with the calling
@@ -71,8 +71,15 @@ interface IDumpstate {
                        int bugreportMode, IDumpstateListener listener,
                        boolean isScreenshotRequested);

    /*
    /**
     * Cancels the bugreport currently in progress.
     *
     * <p>The caller must match the original caller of {@link #startBugreport} in order for the
     * report to actually be cancelled. A {@link SecurityException} is reported if a mismatch is
     * detected.
     *
     * @param callingUid UID of the original application that requested the cancellation.
     * @param callingPackage package of the original application that requested the cancellation.
     */
    void cancelBugreport();
    void cancelBugreport(int callingUid, @utf8InCpp String callingPackage);
}