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

Commit 0785d489 authored by John Reck's avatar John Reck Committed by android-build-merger
Browse files

Merge "Fix buffer overflow in Trace's JNI layer" into qt-dev

am: 935a535b

Change-Id: Ifb631607efe3e4d5ece9897851afe5153d237897
parents b17cdd14 935a535b
Loading
Loading
Loading
Loading
+17 −14
Original line number Diff line number Diff line
@@ -24,26 +24,29 @@

namespace android {

inline static void sanitizeString(char* str, size_t size) {
    for (size_t i = 0; i < size; i++) {
        char c = str[i];
        if (c == '\0' || c == '\n' || c == '|') {
            str[i] = ' ';
inline static void sanitizeString(char* str) {
    while (*str) {
        char c = *str;
        if (c == '\n' || c == '|') {
            *str = ' ';
        }
        str++;
    }
}

inline static void getString(JNIEnv* env, jstring jstring, char* outBuffer, jsize maxSize) {
    jsize size = std::min(env->GetStringLength(jstring), maxSize);
    env->GetStringUTFRegion(jstring, 0, size, outBuffer);
    sanitizeString(outBuffer, size);
    outBuffer[size] = '\0';
}

template<typename F>
inline static void withString(JNIEnv* env, jstring jstr, F callback) {
    std::array<char, 1024> buffer;
    getString(env, jstr, buffer.data(), buffer.size());
    // We need to handle the worst case of 1 character -> 4 bytes
    // So make a buffer of size 4097 and let it hold a string with a maximum length
    // of 1024. The extra last byte for the null terminator.
    std::array<char, 4097> buffer;
    // We have no idea of knowing how much data GetStringUTFRegion wrote, so null it out in
    // advance so we can have a reliable null terminator
    memset(buffer.data(), 0, buffer.size());
    jsize size = std::min(env->GetStringLength(jstr), 1024);
    env->GetStringUTFRegion(jstr, 0, size, buffer.data());
    sanitizeString(buffer.data());

    callback(buffer.data());
}