Status Update
Comments
jc...@magicleap.com <jc...@magicleap.com> #2
I'm pretty far from being a C++ expert, but I think this may be due to holding a reference to the Config
beyond it's lifetime?
See StartDiscovery()
:
void StartDiscovery() {
...
g_state->task_runner->PostTask([]() {
// optional<Config> created here
auto config = GetConfigForAllInterfaces();
if (!config) {
return;
}
// long-lived reference of config given to OpenScreen
g_state->service = discovery::CreateDnsSdService(g_state->task_runner.get(),
g_state->reporting_client.get(), *config);
for (int i = 0; i < kNumADBDNSServices; ++i) {
auto receiver = std::make_unique<ServiceReceiver>(
g_state->service.get(), kADBDNSServices[i], OnServiceReceiverResult);
receiver->StartDiscovery();
...
}
...
// config destructed here
});
}
jc...@magicleap.com <jc...@magicleap.com> #3
A word on impact:
- We rely on WiFi debugging because we use the USB port for additional devices.
- This has made WiFi based debugging unreliable and painful to use because when ADB crashes the connection is lost and is not automatically re-created. Often it can required manually toggling WiFi debugging on the tablet.
en...@google.com <en...@google.com> #4
I've left Wireshark running over the weekend to detect truncated MDNS queries and can confirm they are killing ADB. The truncated messages seem like valid network traffic, so it shouldn't be killing ADB.
Attached are wireshark records in a screenshot which line up with the ADB logs (timezone is Adelaide +10:30):
daniel@RES-0128:/ressys/maxedge$ cat /tmp/adb.5005.log | grep -ie Bridge -e OSP | tail
01-15 00:02:38.265 37828 37828 F adb : logging.cpp:39 OSP_CHECK((max_allowed_messages_) > (0)) failed: 0 vs. 0:
01-15 00:02:41.413 37846 37846 I adb : main.cpp:63 Android Debug Bridge version 1.0.41
01-15 07:58:02.786 37846 37846 F adb : logging.cpp:39 OSP_CHECK((max_allowed_messages_) > (0)) failed: 0 vs. 0:
01-15 07:58:05.928 40026 40026 I adb : main.cpp:63 Android Debug Bridge version 1.0.41
01-15 08:02:46.408 40026 40026 F adb : logging.cpp:39 OSP_CHECK((max_allowed_messages_) > (0)) failed: 0 vs. 0:
01-15 08:02:48.548 40054 40054 I adb : main.cpp:63 Android Debug Bridge version 1.0.41
01-15 08:11:55.906 40054 40054 F adb : logging.cpp:39 OSP_CHECK((max_allowed_messages_) > (0)) failed: 0 vs. 0:
01-15 08:11:59.048 40092 40092 I adb : main.cpp:63 Android Debug Bridge version 1.0.41
01-15 08:48:03.117 40092 40092 F adb : logging.cpp:39 OSP_CHECK((max_allowed_messages_) > (0)) failed: 0 vs. 0:
01-15 08:48:06.280 41928 41928 I adb : main.cpp:63 Android Debug Bridge version 1.0.41
jc...@magicleap.com <jc...@magicleap.com> #6
jc...@magicleap.com <jc...@magicleap.com> #7
My previous comment giving the steps to replicate the issue appears to have been deleted. I have since forgotten the specifics of the steps, but can share the broad outlines.
- Attached is a PCAP containing a truncated message.
- Replay this PCAP over UDP (using a tool like
https://github.com/ska-sa/udpreplay )
df...@magicleap.com <df...@magicleap.com> #8
I am able to repro. I can reply with tcpreplay.
tcpreplay -i en0 ~/Downloads/truncated\ mDNS\ packets.pcapng
en...@google.com <en...@google.com> #9
It looks like we are not using openscreen
properly. Config
should live as long as the Service is alive. The docs of MdnsResponder and MdnsServiceImpl are explicit.
MdnsResponder:
// |record_handler|, |sender|, |receiver|, |task_runner|, |random_delay|, and
// |config| are expected to persist for the duration of this instance's
// lifetime.
MdnsServiceImpl
// |task_runner|, |reporting_client|, and |config| must exist for the duration
// of this instance's life.
df...@magicleap.com <df...@magicleap.com> #10
Fixed in aosp/2909778
sh...@google.com <sh...@google.com>
sh...@google.com <sh...@google.com> #13
daemon not running; starting now at tcp:5037
sh...@google.com <sh...@google.com> #14
Mine has an error with ui nit just the I, not sure how literal this verbose problem is...please keep us updated.....64 arm correct?
sh...@google.com <sh...@google.com> #15
en...@google.com <en...@google.com> #16
ph...@gmail.com <ph...@gmail.com> #17
sh...@google.com <sh...@google.com> #18
ju...@gmail.com <ju...@gmail.com> #20
ka...@gmail.com <ka...@gmail.com> #22
Reda
ju...@gmail.com <ju...@gmail.com> #24
ju...@gmail.com <ju...@gmail.com> #25
[Deleted User] <[Deleted User]> #26
tr...@gmail.com <tr...@gmail.com> #27
xu...@gmail.com <xu...@gmail.com> #28
Bardzo dobre
xu...@gmail.com <xu...@gmail.com> #29
Zadowolony
fa...@hotmail.com <fa...@hotmail.com> #30
Scan hacking
ju...@gmail.com <ju...@gmail.com> #31
Please update my best practice
fr...@gmail.com <fr...@gmail.com> #32
Excelente inicio
ka...@gmail.com <ka...@gmail.com> #33
Please update
fa...@gmail.com <fa...@gmail.com> #34
Done
br...@gmail.com <br...@gmail.com> #35
Get Outlook for Android<
________________________________
From: buganizer-system@google.com <buganizer-system@google.com>
Sent: Tuesday, January 7, 2025 11:29:46 PM
To: b-system+-1739714008@google.com <b-system+-1739714008@google.com>
Cc: kwamanabrown1@gmail.com <kwamanabrown1@gmail.com>
Subject: Re:
Replying to this email means your email address will be shared with the team that works on this product.
Changed
am...@gmail.com added
Done
_______________________________
Reference Info: 294120933 ADB crashes with often due to openscreen error
component: Android Public Tracker > App Development > SDK > platform tools > adb<
status: Fixed
reporter: da...@maxmine.com.au
assignee: sa...@google.com
cc: ad...@google.com, sa...@google.com
type: Bug
access level: Default access
priority: P2
severity: S2
retention: Component default
Generated by Google IssueTracker notification system.
You're receiving this email because you are subscribed to updates on Google IssueTracker
Unsubscribe from this issue.<
sh...@google.com <sh...@google.com>
on...@gmail.com <on...@gmail.com> #36
ro...@gmail.com <ro...@gmail.com> #37
tnx
ro...@gmail.com <ro...@gmail.com> #38
Brigadao
pr...@gmail.com <pr...@gmail.com> #39
Add a comment
da...@gmail.com <da...@gmail.com> #40
.
Description
maxPacketSize=5120
zero_mask = 5120-1 = 0b1001111111111
usb_write() is called with buffer of length 1024 0x10000000000
The following expression in usb_write() will not properly determine when to send the ZLP.
if(!(len & handle->zero_mask)) {
In some cases, a ZLP will be written when it's not needed (the ZLP is only needed when the amount of data being written is an integer multiple of maxPacketSize, as explained here
In a much more troubling case, a ZLP will NOT be written when it should. Imagine, in the above scenario (maxPacketSize=5120), that usb_write() is called with 5120. The expression !(5120 & 5119) resolves to false, and so a ZLP is not sent, but clearly 5120 is an integer multiple of 5120, and thus a ZLP should be sent. This can absolutely result in buggy behavior. In fact, with Android 10 devices, it can result in adb aborting. How? Well, because a ZLP hasn't been sent, the buffer may be combined with a subsequent write and adbd might receive a combination of two amessages (the final payload portion of one message, and a header (24 bytes) of the next amessage). We are in fact seeing that happen. And because UsbFfsConnection::ProcessRead() in Android 10 has a CHECK_LE() to ensure the final read of an amessage has exactly the expected remaining bytes of the amesssage and not one byte more, then adbd aborts (effectively "crashes").