Merge "adb: fix host-side serial number parsing for IPv6."
am: b1c4d90215
Change-Id: I62454f520192df9b600280b59704e7c0fe55687f
This commit is contained in:
commit
94c652ed31
2 changed files with 27 additions and 5 deletions
|
|
@ -307,6 +307,17 @@ TEST(socket_test, test_skip_host_serial) {
|
||||||
// Don't register a port unless it's all numbers and ends with ':'.
|
// Don't register a port unless it's all numbers and ends with ':'.
|
||||||
VerifySkipHostSerial(protocol + "foo:123", ":123");
|
VerifySkipHostSerial(protocol + "foo:123", ":123");
|
||||||
VerifySkipHostSerial(protocol + "foo:123bar:baz", ":123bar:baz");
|
VerifySkipHostSerial(protocol + "foo:123bar:baz", ":123bar:baz");
|
||||||
|
|
||||||
|
VerifySkipHostSerial(protocol + "100.100.100.100:5555:foo", ":foo");
|
||||||
|
VerifySkipHostSerial(protocol + "[0123:4567:89ab:CDEF:0:9:a:f]:5555:foo", ":foo");
|
||||||
|
VerifySkipHostSerial(protocol + "[::1]:5555:foo", ":foo");
|
||||||
|
|
||||||
|
// If we can't find both [] then treat it as a normal serial with [ in it.
|
||||||
|
VerifySkipHostSerial(protocol + "[0123:foo", ":foo");
|
||||||
|
|
||||||
|
// Don't be fooled by random IPv6 addresses in the command string.
|
||||||
|
VerifySkipHostSerial(protocol + "foo:ping [0123:4567:89ab:CDEF:0:9:a:f]:5555",
|
||||||
|
":ping [0123:4567:89ab:CDEF:0:9:a:f]:5555");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -622,21 +622,32 @@ char* skip_host_serial(char* service) {
|
||||||
service += 4;
|
service += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* first_colon = strchr(service, ':');
|
// Check for an IPv6 address. `adb connect` creates the serial number from the canonical
|
||||||
if (!first_colon) {
|
// network address so it will always have the [] delimiters.
|
||||||
|
if (service[0] == '[') {
|
||||||
|
char* ipv6_end = strchr(service, ']');
|
||||||
|
if (ipv6_end != nullptr) {
|
||||||
|
service = ipv6_end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The next colon we find must either begin the port field or the command field.
|
||||||
|
char* colon_ptr = strchr(service, ':');
|
||||||
|
if (!colon_ptr) {
|
||||||
// No colon in service string.
|
// No colon in service string.
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* serial_end = first_colon;
|
// If the next field is only decimal digits and ends with another colon, it's a port.
|
||||||
|
char* serial_end = colon_ptr;
|
||||||
if (isdigit(serial_end[1])) {
|
if (isdigit(serial_end[1])) {
|
||||||
serial_end++;
|
serial_end++;
|
||||||
while (*serial_end && isdigit(*serial_end)) {
|
while (*serial_end && isdigit(*serial_end)) {
|
||||||
serial_end++;
|
serial_end++;
|
||||||
}
|
}
|
||||||
if (*serial_end != ':') {
|
if (*serial_end != ':') {
|
||||||
// Something other than numbers was found, reset the end.
|
// Something other than "<port>:" was found, this must be the command field instead.
|
||||||
serial_end = first_colon;
|
serial_end = colon_ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return serial_end;
|
return serial_end;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue