diff options
19 files changed, 103 insertions, 73 deletions
diff --git a/android/app/res/values-fi/strings.xml b/android/app/res/values-fi/strings.xml index 110df13623..2ce26a0d2a 100644 --- a/android/app/res/values-fi/strings.xml +++ b/android/app/res/values-fi/strings.xml @@ -31,7 +31,7 @@ <string name="bt_enable_line1" msgid="8429910585843481489">"Jos haluat käyttää Bluetooth-palveluita, ota Bluetooth käyttöön."</string> <string name="bt_enable_line2" msgid="1466367120348920892">"Otetaanko Bluetooth käyttöön nyt?"</string> <string name="bt_enable_cancel" msgid="6770180540581977614">"Peru"</string> - <string name="bt_enable_ok" msgid="4224374055813566166">"Ota käyttöön"</string> + <string name="bt_enable_ok" msgid="4224374055813566166">"Laita päälle"</string> <string name="incoming_file_confirm_title" msgid="938251186275547290">"Tiedostonsiirto"</string> <string name="incoming_file_confirm_content" msgid="6573502088511901157">"Hyväksytäänkö saapuva tiedosto?"</string> <string name="incoming_file_confirm_cancel" msgid="9205906062663982692">"Hylkää"</string> diff --git a/android/app/res/values-ne/strings.xml b/android/app/res/values-ne/strings.xml index ab17805530..a0275e75db 100644 --- a/android/app/res/values-ne/strings.xml +++ b/android/app/res/values-ne/strings.xml @@ -125,11 +125,11 @@ <string name="bluetooth_map_settings_title" msgid="4226030082708590023">"ब्लुटुथ सन्देश साझेदारी सेटिङहरू"</string> <string name="bluetooth_map_settings_no_account_slots_left" msgid="755024228476065757">"खाता चयन गर्न सक्दैन। ० स्लटहरू बाँकी"</string> <string name="bluetooth_connected" msgid="5687474377090799447">"ब्लुटुथ सम्बन्धी अडियो यन्त्रलाई जडान गरियो"</string> - <string name="bluetooth_disconnected" msgid="6841396291728343534">"ब्लुटुथ सम्बन्धी अडियो यन्त्रलाई विच्छेद गरियो"</string> + <string name="bluetooth_disconnected" msgid="6841396291728343534">"ब्लुटुथ सम्बन्धी अडियो यन्त्रलाई डिस्कनेक्ट गरियो"</string> <string name="a2dp_sink_mbs_label" msgid="6035366346569127155">"ब्लुटुथको अडियो"</string> <string name="bluetooth_opp_file_limit_exceeded" msgid="6612109860149473930">"४ जि.बि. भन्दा ठूला फाइलहरूलाई स्थानान्तरण गर्न सकिँदैन"</string> <string name="bluetooth_connect_action" msgid="2319449093046720209">"ब्लुटुथमा कनेक्ट गर्नुहोस्"</string> - <string name="bluetooth_enabled_apm_title" msgid="6914461147844949044">"हवाइजहाज मोडमा ब्लुटुथ अन राखियोस्"</string> + <string name="bluetooth_enabled_apm_title" msgid="6914461147844949044">"हवाइजहाज मोडमा ब्लुटुथ अन राख्नुहोस्"</string> <string name="bluetooth_enabled_apm_message" msgid="6168686193308136881">"तपाईंले ब्लुटुथ अन राखिराख्नुभयो भने तपाईंले आफ्नो डिभाइस अर्को पटक हवाइजहाज मोडमा लैजाँदा तपाईंको डिभाइसले ब्लुटुथ अन राख्नु पर्ने कुरा याद गर्छ"</string> <string name="bluetooth_stays_on_title" msgid="39720820955212918">"ब्लुटुथ अन रहन्छ"</string> <string name="bluetooth_stays_on_message" msgid="3669663452593157737">"तपाईंको डिभाइस अर्को पटक हवाइजहाज मोडमा लैजाँदा तपाईंको फोनले ब्लुटुथ अन राख्नु पर्ने कुरा याद गर्छ। तपाईं ब्लुटुथ अन भइनरहोस् भन्ने चाहनुहुन्छ भने ब्लुटुथ अफ गर्नुहोस्।"</string> diff --git a/android/app/src/com/android/bluetooth/Utils.java b/android/app/src/com/android/bluetooth/Utils.java index dcaf72ffc9..316fbcb747 100644 --- a/android/app/src/com/android/bluetooth/Utils.java +++ b/android/app/src/com/android/bluetooth/Utils.java @@ -617,10 +617,10 @@ public final class Utils { } // STOPSHIP(b/188391719): enable this security enforcement // attributionSource.enforceCallingUid(); - AttributionSource currentAttribution = new AttributionSource - .Builder(context.getAttributionSource()) - .setNext(attributionSource) - .build(); + AttributionSource currentAttribution = + new AttributionSource.Builder(context.getAttributionSource()) + .setNext(Objects.requireNonNull(attributionSource)) + .build(); PermissionManager pm = context.getSystemService(PermissionManager.class); if (pm == null) { return false; @@ -892,10 +892,10 @@ public final class Utils { Log.e(TAG, "Permission denial: Location is off."); return false; } - AttributionSource currentAttribution = new AttributionSource - .Builder(context.getAttributionSource()) - .setNext(attributionSource) - .build(); + AttributionSource currentAttribution = + new AttributionSource.Builder(context.getAttributionSource()) + .setNext(Objects.requireNonNull(attributionSource)) + .build(); // STOPSHIP(b/188391719): enable this security enforcement // attributionSource.enforceCallingUid(); PermissionManager pm = context.getSystemService(PermissionManager.class); @@ -926,10 +926,10 @@ public final class Utils { return false; } - final AttributionSource currentAttribution = new AttributionSource - .Builder(context.getAttributionSource()) - .setNext(attributionSource) - .build(); + final AttributionSource currentAttribution = + new AttributionSource.Builder(context.getAttributionSource()) + .setNext(Objects.requireNonNull(attributionSource)) + .build(); // STOPSHIP(b/188391719): enable this security enforcement // attributionSource.enforceCallingUid(); PermissionManager pm = context.getSystemService(PermissionManager.class); @@ -964,10 +964,10 @@ public final class Utils { return false; } - AttributionSource currentAttribution = new AttributionSource - .Builder(context.getAttributionSource()) - .setNext(attributionSource) - .build(); + AttributionSource currentAttribution = + new AttributionSource.Builder(context.getAttributionSource()) + .setNext(Objects.requireNonNull(attributionSource)) + .build(); // STOPSHIP(b/188391719): enable this security enforcement // attributionSource.enforceCallingUid(); PermissionManager pm = context.getSystemService(PermissionManager.class); diff --git a/android/app/tests/unit/src/com/android/bluetooth/UtilsTest.java b/android/app/tests/unit/src/com/android/bluetooth/UtilsTest.java index b4d73bc5c1..2b3d17ee13 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/UtilsTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/UtilsTest.java @@ -120,10 +120,12 @@ public class UtilsTest { boolean enabledStatus = locationManager.isLocationEnabledForUser(userHandle); locationManager.setLocationEnabledForUser(false, userHandle); - assertThat(Utils.checkCallerHasCoarseLocation(context, null, userHandle)).isFalse(); + assertThat(Utils.checkCallerHasCoarseLocation( + context, context.getAttributionSource(), userHandle)) + .isFalse(); locationManager.setLocationEnabledForUser(true, userHandle); - Utils.checkCallerHasCoarseLocation(context, null, userHandle); + Utils.checkCallerHasCoarseLocation(context, context.getAttributionSource(), userHandle); if (!enabledStatus) { locationManager.setLocationEnabledForUser(false, userHandle); } @@ -137,10 +139,13 @@ public class UtilsTest { boolean enabledStatus = locationManager.isLocationEnabledForUser(userHandle); locationManager.setLocationEnabledForUser(false, userHandle); - assertThat(Utils.checkCallerHasCoarseOrFineLocation(context, null, userHandle)).isFalse(); + assertThat(Utils.checkCallerHasCoarseOrFineLocation( + context, context.getAttributionSource(), userHandle)) + .isFalse(); locationManager.setLocationEnabledForUser(true, userHandle); - Utils.checkCallerHasCoarseOrFineLocation(context, null, userHandle); + Utils.checkCallerHasCoarseOrFineLocation( + context, context.getAttributionSource(), userHandle); if (!enabledStatus) { locationManager.setLocationEnabledForUser(false, userHandle); } diff --git a/flags/security.aconfig b/flags/security.aconfig index c90cbe4ca2..f09cd2a201 100644 --- a/flags/security.aconfig +++ b/flags/security.aconfig @@ -42,3 +42,14 @@ flag { description: "Fix the passkey entry bypassing bug in SMP" bug: "321300737" } + +flag { + name: "bta_av_setconfig_rej_type_confusion" + namespace: "bluetooth" + description: "Use stream control block for bta_av_setconfig_rej instead of a possibly incorrect union type" + bug: "341754333" + metadata { + purpose: PURPOSE_BUGFIX + } +} + diff --git a/framework/Android.bp b/framework/Android.bp index 5d1ede6731..dcaaf0e733 100644 --- a/framework/Android.bp +++ b/framework/Android.bp @@ -67,7 +67,6 @@ java_sdk_library { impl_library_visibility: [ "//external/sl4a/Common", - "//frameworks/opt/wear", "//packages/modules/Bluetooth/android/app/tests/unit", "//packages/modules/Bluetooth/android/pandora/server", "//packages/modules/Bluetooth/framework/tests/bumble", diff --git a/service/src/com/android/server/bluetooth/BtPermissionUtils.java b/service/src/com/android/server/bluetooth/BtPermissionUtils.java index c68f25b65f..b3ba3b013d 100644 --- a/service/src/com/android/server/bluetooth/BtPermissionUtils.java +++ b/service/src/com/android/server/bluetooth/BtPermissionUtils.java @@ -86,7 +86,9 @@ class BtPermissionUtils { String message) { final String permission = BLUETOOTH_CONNECT; AttributionSource currentSource = - new AttributionSource.Builder(ctx.getAttributionSource()).setNext(source).build(); + new AttributionSource.Builder(ctx.getAttributionSource()) + .setNext(Objects.requireNonNull(source)) + .build(); final int result = permissionManager.checkPermissionForDataDeliveryFromDataSource( permission, currentSource, message); diff --git a/system/bta/le_audio/audio_hal_client/audio_hal_client.h b/system/bta/le_audio/audio_hal_client/audio_hal_client.h index 9d9ffa5bab..e1462b5442 100644 --- a/system/bta/le_audio/audio_hal_client/audio_hal_client.h +++ b/system/bta/le_audio/audio_hal_client/audio_hal_client.h @@ -103,7 +103,8 @@ class LeAudioSinkAudioHalClient { virtual ~Callbacks() = default; virtual void OnAudioSuspend(void) = 0; virtual void OnAudioResume(void) = 0; - virtual void OnAudioMetadataUpdate(sink_metadata_v7 sink_metadata) = 0; + virtual void OnAudioMetadataUpdate( + const std::vector<struct record_track_metadata_v7> sink_metadata) = 0; base::WeakPtrFactory<Callbacks> weak_factory_{this}; }; @@ -143,8 +144,9 @@ class LeAudioSourceAudioHalClient { virtual void OnAudioDataReady(const std::vector<uint8_t>& data) = 0; virtual void OnAudioSuspend(void) = 0; virtual void OnAudioResume(void) = 0; - virtual void OnAudioMetadataUpdate(source_metadata_v7 source_metadata, - DsaMode dsa_mode) = 0; + virtual void OnAudioMetadataUpdate( + const std::vector<struct playback_track_metadata_v7> source_metadata, + DsaMode dsa_mode) = 0; base::WeakPtrFactory<Callbacks> weak_factory_{this}; }; diff --git a/system/bta/le_audio/audio_hal_client/audio_hal_client_test.cc b/system/bta/le_audio/audio_hal_client/audio_hal_client_test.cc index 134e1c1c54..a66b629d65 100644 --- a/system/bta/le_audio/audio_hal_client/audio_hal_client_test.cc +++ b/system/bta/le_audio/audio_hal_client/audio_hal_client_test.cc @@ -223,9 +223,11 @@ class MockLeAudioClientAudioSinkEventReceiver (override)); MOCK_METHOD((void), OnAudioSuspend, (), (override)); MOCK_METHOD((void), OnAudioResume, (), (override)); - MOCK_METHOD((void), OnAudioMetadataUpdate, - (source_metadata_v7 source_metadata, DsaMode dsa_mode), - (override)); + MOCK_METHOD( + (void), OnAudioMetadataUpdate, + (const std::vector<struct playback_track_metadata_v7> source_metadata, + DsaMode dsa_mode), + (override)); }; class MockAudioHalClientEventReceiver @@ -233,8 +235,10 @@ class MockAudioHalClientEventReceiver public: MOCK_METHOD((void), OnAudioSuspend, (), (override)); MOCK_METHOD((void), OnAudioResume, (), (override)); - MOCK_METHOD((void), OnAudioMetadataUpdate, (sink_metadata_v7 sink_metadata), - (override)); + MOCK_METHOD( + (void), OnAudioMetadataUpdate, + (const std::vector<struct record_track_metadata_v7> sink_metadata), + (override)); }; class LeAudioClientAudioTest : public ::testing::Test { diff --git a/system/bta/le_audio/audio_hal_client/audio_sink_hal_client.cc b/system/bta/le_audio/audio_hal_client/audio_sink_hal_client.cc index 4a81a223d3..b69cc0d86a 100644 --- a/system/bta/le_audio/audio_hal_client/audio_sink_hal_client.cc +++ b/system/bta/le_audio/audio_hal_client/audio_sink_hal_client.cc @@ -167,11 +167,15 @@ bool SinkImpl::OnMetadataUpdateReq(const sink_metadata_v7_t& sink_metadata) { return false; } + std::vector<struct record_track_metadata_v7> metadata( + sink_metadata.tracks, sink_metadata.tracks + sink_metadata.track_count); + bt_status_t status = do_in_main_thread( FROM_HERE, base::BindOnce( &LeAudioSinkAudioHalClient::Callbacks::OnAudioMetadataUpdate, - audioSinkCallbacks_->weak_factory_.GetWeakPtr(), sink_metadata)); + audioSinkCallbacks_->weak_factory_.GetWeakPtr(), + std::move(metadata))); if (status == BT_STATUS_SUCCESS) { return true; } diff --git a/system/bta/le_audio/audio_hal_client/audio_source_hal_client.cc b/system/bta/le_audio/audio_hal_client/audio_source_hal_client.cc index 6470edb6dd..68c93116b1 100644 --- a/system/bta/le_audio/audio_hal_client/audio_source_hal_client.cc +++ b/system/bta/le_audio/audio_hal_client/audio_source_hal_client.cc @@ -310,12 +310,16 @@ bool SourceImpl::OnMetadataUpdateReq( return false; } + std::vector<struct playback_track_metadata_v7> metadata( + source_metadata.tracks, + source_metadata.tracks + source_metadata.track_count); + bt_status_t status = do_in_main_thread( FROM_HERE, base::BindOnce( &LeAudioSourceAudioHalClient::Callbacks::OnAudioMetadataUpdate, - audioSourceCallbacks_->weak_factory_.GetWeakPtr(), source_metadata, - dsa_mode)); + audioSourceCallbacks_->weak_factory_.GetWeakPtr(), + std::move(metadata), dsa_mode)); if (status == BT_STATUS_SUCCESS) { return true; } diff --git a/system/bta/le_audio/broadcaster/broadcaster.cc b/system/bta/le_audio/broadcaster/broadcaster.cc index c6c17c4b4c..f3b08388ee 100644 --- a/system/bta/le_audio/broadcaster/broadcaster.cc +++ b/system/bta/le_audio/broadcaster/broadcaster.cc @@ -1249,8 +1249,9 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks { instance->le_audio_source_hal_client_->ConfirmStreamingRequest(); } - virtual void OnAudioMetadataUpdate(source_metadata_v7 source_metadata, - DsaMode dsa_mode) override { + virtual void OnAudioMetadataUpdate( + const std::vector<struct playback_track_metadata_v7> source_metadata, + DsaMode dsa_mode) override { log::info(""); if (!instance) return; diff --git a/system/bta/le_audio/broadcaster/broadcaster_test.cc b/system/bta/le_audio/broadcaster/broadcaster_test.cc index b5962aecdf..8630ed0b16 100644 --- a/system/bta/le_audio/broadcaster/broadcaster_test.cc +++ b/system/bta/le_audio/broadcaster/broadcaster_test.cc @@ -828,10 +828,8 @@ TEST_F(BroadcasterTest, UpdateMetadataFromAudioTrackMetadata) { tracks_vec.push_back(desc_track); } - const source_metadata_v7_t source_metadata = { - .track_count = tracks_vec.size(), .tracks = tracks_vec.data()}; - - audio_receiver->OnAudioMetadataUpdate(source_metadata, DsaMode::DISABLED); + audio_receiver->OnAudioMetadataUpdate(std::move(tracks_vec), + DsaMode::DISABLED); // Verify ccid ASSERT_NE(ccid_list.size(), 0u); diff --git a/system/bta/le_audio/client.cc b/system/bta/le_audio/client.cc index 5792ba3228..918bcad423 100644 --- a/system/bta/le_audio/client.cc +++ b/system/bta/le_audio/client.cc @@ -4665,8 +4665,9 @@ class LeAudioClientImpl : public LeAudioClient { return true; } - void OnLocalAudioSourceMetadataUpdate(source_metadata_v7 source_metadata, - DsaMode dsa_mode) { + void OnLocalAudioSourceMetadataUpdate( + const std::vector<struct playback_track_metadata_v7>& source_metadata, + DsaMode dsa_mode) { if (active_group_id_ == bluetooth::groups::kGroupUnknown) { log::warn(", cannot start streaming if no active group set"); return; @@ -4818,7 +4819,8 @@ class LeAudioClientImpl : public LeAudioClient { ToString(contexts_pair.sink), ToString(contexts_pair.source)); } - void OnLocalAudioSinkMetadataUpdate(sink_metadata_v7 sink_metadata) { + void OnLocalAudioSinkMetadataUpdate( + const std::vector<record_track_metadata_v7>& sink_metadata) { if (active_group_id_ == bluetooth::groups::kGroupUnknown) { log::warn(", cannot start streaming if no active group set"); return; @@ -6184,11 +6186,11 @@ class SourceCallbacksImpl : public LeAudioSourceAudioHalClient::Callbacks { if (instance) instance->OnLocalAudioSourceResume(); } - void OnAudioMetadataUpdate(source_metadata_v7 source_metadata, - DsaMode dsa_mode) override { + void OnAudioMetadataUpdate( + std::vector<struct playback_track_metadata_v7> source_metadata, + DsaMode dsa_mode) override { if (instance) - instance->OnLocalAudioSourceMetadataUpdate(std::move(source_metadata), - dsa_mode); + instance->OnLocalAudioSourceMetadataUpdate(source_metadata, dsa_mode); } }; @@ -6201,9 +6203,9 @@ class SinkCallbacksImpl : public LeAudioSinkAudioHalClient::Callbacks { if (instance) instance->OnLocalAudioSinkResume(); } - void OnAudioMetadataUpdate(sink_metadata_v7 sink_metadata) override { - if (instance) - instance->OnLocalAudioSinkMetadataUpdate(std::move(sink_metadata)); + void OnAudioMetadataUpdate( + std::vector<record_track_metadata_v7> sink_metadata) override { + if (instance) instance->OnLocalAudioSinkMetadataUpdate(sink_metadata); } }; diff --git a/system/bta/le_audio/le_audio_client_test.cc b/system/bta/le_audio/le_audio_client_test.cc index 69f3d069e9..0261e4cc31 100644 --- a/system/bta/le_audio/le_audio_client_test.cc +++ b/system/bta/le_audio/le_audio_client_test.cc @@ -1982,9 +1982,6 @@ class UnicastTestNoInit : public Test { tracks_vec.push_back(desc_track); } - const source_metadata_v7_t source_metadata = { - .track_count = tracks_vec.size(), .tracks = tracks_vec.data()}; - ASSERT_NE(nullptr, mock_le_audio_source_hal_client_); /* Local Source may reconfigure once the metadata is updated */ if (reconfigure_existing_stream) { @@ -2005,7 +2002,7 @@ class UnicastTestNoInit : public Test { } ASSERT_NE(unicast_source_hal_cb_, nullptr); - unicast_source_hal_cb_->OnAudioMetadataUpdate(source_metadata, + unicast_source_hal_cb_->OnAudioMetadataUpdate(std::move(tracks_vec), DsaMode::DISABLED); } @@ -2046,11 +2043,8 @@ class UnicastTestNoInit : public Test { tracks_vec.push_back(desc_track); } - const sink_metadata_v7_t sink_metadata = {.track_count = tracks_vec.size(), - .tracks = tracks_vec.data()}; - ASSERT_NE(nullptr, unicast_sink_hal_cb_); - unicast_sink_hal_cb_->OnAudioMetadataUpdate(sink_metadata); + unicast_sink_hal_cb_->OnAudioMetadataUpdate(std::move(tracks_vec)); } void LocalAudioSourceSuspend(void) { diff --git a/system/bta/le_audio/le_audio_utils.cc b/system/bta/le_audio/le_audio_utils.cc index 7f9f40004a..2e30615ade 100644 --- a/system/bta/le_audio/le_audio_utils.cc +++ b/system/bta/le_audio/le_audio_utils.cc @@ -181,19 +181,18 @@ static bool isMetadataTagPresent(const char* tags, const char* tag) { } AudioContexts GetAudioContextsFromSourceMetadata( - const source_metadata_v7& source_metadata) { + const std::vector<struct playback_track_metadata_v7>& source_metadata) { AudioContexts track_contexts; - for (size_t i = 0; i < source_metadata.track_count; i++) { - auto track = source_metadata.tracks[i].base; + for (const auto& entry : source_metadata) { + auto track = entry.base; if (track.content_type == 0 && track.usage == 0) continue; log::info("usage={}({}), content_type={}({}), gain={:f}, tag:{}", usageToString(track.usage), track.usage, - contentTypeToString(track.content_type), track.content_type, - track.gain, source_metadata.tracks[i].tags); + contentTypeToString(track.content_type), + track.content_type, track.gain, entry.tags); - if (isMetadataTagPresent(source_metadata.tracks[i].tags, - "VX_AOSP_SAMPLESOUND")) { + if (isMetadataTagPresent(entry.tags, "VX_AOSP_SAMPLESOUND")) { track_contexts.set(LeAudioContextType::SOUNDEFFECTS); } else { track_contexts.set( @@ -204,11 +203,11 @@ AudioContexts GetAudioContextsFromSourceMetadata( } AudioContexts GetAudioContextsFromSinkMetadata( - const sink_metadata_v7& sink_metadata) { + const std::vector<struct record_track_metadata_v7>& sink_metadata) { AudioContexts all_track_contexts; - for (size_t i = 0; i < sink_metadata.track_count; i++) { - auto track = sink_metadata.tracks[i].base; + for (const auto& entry : sink_metadata) { + auto track = entry.base; if (track.source == AUDIO_SOURCE_INVALID) continue; LeAudioContextType track_context; diff --git a/system/bta/le_audio/le_audio_utils.h b/system/bta/le_audio/le_audio_utils.h index 6e6c2ee521..cfd3dcc9be 100644 --- a/system/bta/le_audio/le_audio_utils.h +++ b/system/bta/le_audio/le_audio_utils.h @@ -35,9 +35,9 @@ namespace utils { types::LeAudioContextType AudioContentToLeAudioContext( audio_content_type_t content_type, audio_usage_t usage); types::AudioContexts GetAudioContextsFromSourceMetadata( - const source_metadata_v7& source_metadata); + const std::vector<struct playback_track_metadata_v7>& source_metadata); types::AudioContexts GetAudioContextsFromSinkMetadata( - const sink_metadata_v7& sink_metadata); + const std::vector<struct record_track_metadata_v7>& sink_metadata); /* Helpers to get btle_audio_codec_config_t for Java */ bluetooth::le_audio::btle_audio_codec_index_t diff --git a/system/stack/gatt/att_protocol.cc b/system/stack/gatt/att_protocol.cc index 82f92593c3..719dce54ad 100644 --- a/system/stack/gatt/att_protocol.cc +++ b/system/stack/gatt/att_protocol.cc @@ -206,7 +206,8 @@ static BT_HDR* attp_build_read_by_type_value_cmd( static BT_HDR* attp_build_read_multi_cmd(uint8_t op_code, uint16_t payload_size, uint16_t num_handle, uint16_t* p_handle) { - uint8_t *p, i = 0; + uint8_t* p; + uint16_t i = 0; BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR) + num_handle * 2 + 1 + L2CAP_MIN_OFFSET); diff --git a/system/stack/srvc/srvc_eng.cc b/system/stack/srvc/srvc_eng.cc index 6b64d1a741..dbf30ff8b1 100644 --- a/system/stack/srvc/srvc_eng.cc +++ b/system/stack/srvc/srvc_eng.cc @@ -237,6 +237,10 @@ static void srvc_eng_s_request_cback(uint16_t conn_id, uint32_t trans_id, tGATTS_RSP rsp_msg; uint8_t act = SRVC_ACT_IGNORE; uint8_t clcb_idx = srvc_eng_find_clcb_idx_by_conn_id(conn_id); + if (clcb_idx == SRVC_MAX_APPS) { + log::error("Can't find clcb, id:{}", conn_id); + return; + } log::verbose("srvc_eng_s_request_cback : recv type (0x{:02x})", type); |