看起来 Android 9-6 具有相似的蓝牙子系统,Android 5 和 4 则不同。
Android 9.0
BlueFrag 实验
补丁:
https://android.googlesource.com/platform/system/bt/+/3cb7149d8fed2d7d77ceaa95bf845224c4db3baf
下面我触发了已修补的条件。好的,我想我搞定了,但不知何故我无法使进程崩溃。
嗯嗯嗯

实际上,成功将带符号的长度值传给了 memcpy()```
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch reassemble_and_dispatch
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch partial_packet->offset 40 packet->len 304 HCI_ACL_PREAMBLE_SIZE 4
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch projected_offset 340 partial_packet->len 41
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch got packet which would exceed expected length of 41. Truncating.
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch memcpy packet->len 1 packet->offset 4 expr -3
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch partial_packet->data 0xacb14580 partial_packet->data + partial_packet->offset 0xacb145a8 packet->data 0xa553e110 packet->data + packet->offset 0xa553e114
02-16 01:44:49.097 6423 6469 W bt_hci_packet_fragmenter: fragment_and_dispatch fragment_and_dispatch
仍然没有崩溃,但应该会崩溃的……
在上面的示例中,memcpy 大小为 -3,该值被解释为无符号整数(4294967293),memcpy 会一直执行,直到因未映射内存而发生页面错误,进程应当终止。
我的手机是 32 位的,也许这就是原因。手机是 Samsung S3 Neo+。至少在 Android 9.0 测试中使用了 jemalloc。```
¯\_(ツ)_/¯
看起来是正确的

我怀疑你需要打开许多连接(持续一段时间),并以某种方式分配大量内存,然后它才会崩溃。
我们这里推送的是 4294967293,接近 4GB``` ¯_(ツ)_/¯
Swing 和 leommxj 发现了 Android 8 的这个奇怪行为:
https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fbestwing.me%2FAndroid-8.1-memcpy-func.html
(译自中文)
它可能也会影响 Android 9。会检查一下。
实际上,可能是它不在进程上下文中运行,而是在中断上下文中运行。那么也许这个错误可以被隐藏。