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

Commit c9c1f647 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 7113391 from e3b7b329 to rvc-qpr3-release

Change-Id: Iabb23ca27ba29040360707d19b1f30138fb26da6
parents 6788c9c2 e3b7b329
Loading
Loading
Loading
Loading
+23 −4
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include <android-base/stringprintf.h>
#include <android/binder_ibinder.h>
#include <log/log.h>
#include <private/android_filesystem_config.h>

#include "annotations.h"
@@ -216,13 +217,18 @@ void LogEvent::parseAttributionChain(int32_t* pos, int32_t depth, bool* last,
        last[2] = true;
        parseString(pos, /*depth=*/2, last, /*numAnnotations=*/0);
    }
    // Check if at least one node was successfully parsed.
    if (mValues.size() - 1 > firstUidInChainIndex) {

    if (mValues.size() - 1 > INT8_MAX) {
        mValid = false;
    } else if (mValues.size() - 1 > firstUidInChainIndex) {
        // At least one node was successfully parsed.
        mAttributionChainStartIndex = static_cast<int8_t>(firstUidInChainIndex);
        mAttributionChainEndIndex = static_cast<int8_t>(mValues.size() - 1);
    }

    if (mValid) {
        parseAnnotations(numAnnotations, firstUidInChainIndex);
    }

    pos[1] = pos[2] = 1;
    last[1] = last[2] = false;
@@ -234,7 +240,8 @@ bool LogEvent::checkPreviousValueType(Type expected) {
}

void LogEvent::parseIsUidAnnotation(uint8_t annotationType) {
    if (mValues.empty() || !checkPreviousValueType(INT) || annotationType != BOOL_TYPE) {
    if (mValues.empty() || mValues.size() - 1 > INT8_MAX || !checkPreviousValueType(INT)
            || annotationType != BOOL_TYPE) {
        mValid = false;
        return;
    }
@@ -270,6 +277,12 @@ void LogEvent::parsePrimaryFieldFirstUidAnnotation(uint8_t annotationType,
        return;
    }

    if (static_cast<int>(mValues.size() - 1) < firstUidInChainIndex) { // AttributionChain is empty.
        mValid = false;
        android_errorWriteLog(0x534e4554, "174485572");
        return;
    }

    const bool primaryField = readNextValue<uint8_t>();
    mValues[firstUidInChainIndex].mAnnotations.setPrimaryField(primaryField);
}
@@ -280,6 +293,12 @@ void LogEvent::parseExclusiveStateAnnotation(uint8_t annotationType) {
        return;
    }

    if (mValues.size() - 1 > INT8_MAX) {
        android_errorWriteLog(0x534e4554, "174488848");
        mValid = false;
        return;
    }

    const bool exclusiveState = readNextValue<uint8_t>();
    mExclusiveStateFieldIndex = static_cast<int8_t>(mValues.size() - 1);
    mValues[getExclusiveStateFieldIndex()].mAnnotations.setExclusiveState(exclusiveState);
+110 −0
Original line number Diff line number Diff line
@@ -363,6 +363,116 @@ TEST(LogEventTest, TestResetStateAnnotation) {
    EXPECT_EQ(event.getResetState(), resetState);
}

TEST(LogEventTest, TestExclusiveStateAnnotationAfterTooManyFields) {
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, 100);

    const unsigned int numAttributionNodes = 64;

    uint32_t uids[numAttributionNodes];
    const char* tags[numAttributionNodes];

    for (unsigned int i = 1; i <= numAttributionNodes; i++) {
        uids[i-1] = i;
        tags[i-1] = std::to_string(i).c_str();
    }

    AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes);
    AStatsEvent_writeInt32(event, 1);
    AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_EXCLUSIVE_STATE, true);

    AStatsEvent_build(event);

    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_FALSE(logEvent.parseBuffer(buf, size));
    EXPECT_EQ(-1, logEvent.getExclusiveStateFieldIndex());

    AStatsEvent_release(event);
}

TEST(LogEventTest, TestUidAnnotationAfterTooManyFields) {
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, 100);

    const unsigned int numAttributionNodes = 64;

    uint32_t uids[numAttributionNodes];
    const char* tags[numAttributionNodes];

    for (unsigned int i = 1; i <= numAttributionNodes; i++) {
        uids[i-1] = i;
        tags[i-1] = std::to_string(i).c_str();
    }

    AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes);
    AStatsEvent_writeInt32(event, 1);
    AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_IS_UID, true);

    AStatsEvent_build(event);

    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_FALSE(logEvent.parseBuffer(buf, size));
    EXPECT_EQ(-1, logEvent.getUidFieldIndex());

    AStatsEvent_release(event);
}

TEST(LogEventTest, TestAttributionChainEndIndexAfterTooManyFields) {
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, 100);

    const unsigned int numAttributionNodes = 65;

    uint32_t uids[numAttributionNodes];
    const char* tags[numAttributionNodes];

    for (unsigned int i = 1; i <= numAttributionNodes; i++) {
        uids[i-1] = i;
        tags[i-1] = std::to_string(i).c_str();
    }

    AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes);

    AStatsEvent_build(event);

    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_FALSE(logEvent.parseBuffer(buf, size));
    EXPECT_FALSE(logEvent.hasAttributionChain());

    AStatsEvent_release(event);
}

TEST(LogEventTest, TestEmptyAttributionChainWithPrimaryFieldFirstUidAnnotation) {
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, 100);

    uint32_t uids[] = {};
    const char* tags[] = {};

    AStatsEvent_writeInt32(event, 10);
    AStatsEvent_writeAttributionChain(event, uids, tags, 0);
    AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);

    AStatsEvent_build(event);

    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_FALSE(logEvent.parseBuffer(buf, size));

    AStatsEvent_release(event);
}

}  // namespace statsd
}  // namespace os
}  // namespace android
+7 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.view;

import android.annotation.NonNull;
import android.os.IBinder;

/**
@@ -31,17 +32,20 @@ public final class InputApplicationHandle {
    private long ptr;

    // Application name.
    public String name;
    public final @NonNull String name;

    // Dispatching timeout.
    public long dispatchingTimeoutNanos;
    public final long dispatchingTimeoutNanos;

    public final IBinder token;

    private native void nativeDispose();

    public InputApplicationHandle(IBinder token) {
    public InputApplicationHandle(@NonNull IBinder token, @NonNull String name,
            long dispatchingTimeoutNanos) {
        this.token = token;
        this.name = name;
        this.dispatchingTimeoutNanos = dispatchingTimeoutNanos;
    }

    public InputApplicationHandle(InputApplicationHandle handle) {
+1 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ public final class InputWindowHandle {
    private long ptr;

    // The input application handle.
    public final InputApplicationHandle inputApplicationHandle;
    public InputApplicationHandle inputApplicationHandle;

    // The token associates input data with a window and its input channel. The client input
    // channel and the server input channel will both contain this token.
+5 −0
Original line number Diff line number Diff line
@@ -58,6 +58,11 @@ bool NativeInputApplicationHandle::updateInfo() {
    if (!obj) {
        return false;
    }
    if (mInfo.token.get() != nullptr) {
        // The java fields are immutable, so it doesn't need to update again.
        env->DeleteLocalRef(obj);
        return true;
    }

    mInfo.name = getStringField(env, obj, gInputApplicationHandleClassInfo.name, "<null>");

Loading