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

Commit 10309cf6 authored by Jakub Tyszkowski's avatar Jakub Tyszkowski
Browse files

LeAudio: Fix broadcast code issues

Code was not properly copied in JNI.

Bug: 239697620
Tag: #feature
Test: manually tested
Change-Id: I85acad1122897e71de93181ea0ed3cd200eaae82
Merged-In: I85acad1122897e71de93181ea0ed3cd200eaae82
(cherry picked from commit 10a8fc10)
parent 23111faa
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -605,7 +605,7 @@ jbyteArray prepareRawLtvArray(
                            (const jbyte*)&kv_pair.first);
    offset += 1;
    // Value
    env->SetByteArrayRegion(raw_metadata, offset, 1,
    env->SetByteArrayRegion(raw_metadata, offset, kv_pair.second.size(),
                            (const jbyte*)kv_pair.second.data());
    offset += kv_pair.second.size();
  }
@@ -839,7 +839,19 @@ jobject prepareBluetoothLeBroadcastMetadataObject(
    return nullptr;
  }

  ScopedLocalRef<jbyteArray> code(env, env->NewByteArray(sizeof(RawAddress)));
  // Skip the leading null char bytes
  int nativeCodeSize = 16;
  int nativeCodeLeadingZeros = 0;
  if (broadcast_metadata.broadcast_code) {
    auto& nativeCode = broadcast_metadata.broadcast_code.value();
    nativeCodeLeadingZeros =
        std::find_if(nativeCode.cbegin(), nativeCode.cend(),
                     [](int x) { return x != 0x00; }) -
        nativeCode.cbegin();
    nativeCodeSize = nativeCode.size() - nativeCodeLeadingZeros;
  }

  ScopedLocalRef<jbyteArray> code(env, env->NewByteArray(nativeCodeSize));
  if (!code.get()) {
    LOG(ERROR) << "Failed to create new jbyteArray for the broadcast code";
    return nullptr;
@@ -847,8 +859,10 @@ jobject prepareBluetoothLeBroadcastMetadataObject(

  if (broadcast_metadata.broadcast_code) {
    env->SetByteArrayRegion(
        code.get(), 0, sizeof(RawAddress),
        (jbyte*)broadcast_metadata.broadcast_code.value().data());
        code.get(), 0, nativeCodeSize,
        (const jbyte*)broadcast_metadata.broadcast_code->data() +
            nativeCodeLeadingZeros);
    CHECK(!env->ExceptionCheck());
  }

  return env->NewObject(
@@ -1150,8 +1164,9 @@ static void CreateBroadcastNative(JNIEnv* env, jobject object,
    }

    // Padding with zeros on LSB positions if code is shorter than 16 octets
    env->GetByteArrayRegion(broadcast_code, code_array.size() - size, size,
                            (jbyte*)code_array.data());
    env->GetByteArrayRegion(
        broadcast_code, 0, size,
        (jbyte*)code_array.data() + code_array.size() - size);
  }

  jbyte* meta = env->GetByteArrayElements(metadata, nullptr);