Skip to content
This repository has been archived by the owner on Nov 8, 2023. It is now read-only.

Commit

Permalink
adb: check our socketpair ends in our win32 emulation.
Browse files Browse the repository at this point in the history
In our Win32 socketpair emulation, check that the ends are properly
connected before returning.

Change-Id: I33d356fd9ebcac89fc6a89a5200e926032220383
Test: no additional failing tests in adb_test.exe
  • Loading branch information
jmgao committed Aug 24, 2016
1 parent 704d818 commit 5990191
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
4 changes: 4 additions & 0 deletions adb/sysdeps.h
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,10 @@ extern int adb_socket_accept(int serverfd, struct sockaddr* addr, socklen_t
#undef accept
#define accept ___xxx_accept

int adb_getsockname(int fd, struct sockaddr* sockaddr, socklen_t* optlen);
#undef getsockname
#define getsockname(...) ___xxx_getsockname(__VA__ARGS__)

// Returns the local port number of a bound socket, or -1 on failure.
int adb_socket_get_local_port(int fd);

Expand Down
29 changes: 27 additions & 2 deletions adb/sysdeps_win32.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1061,7 +1061,7 @@ int adb_getsockname(int fd, struct sockaddr* sockaddr, socklen_t* optlen) {
return -1;
}

int result = getsockname(fh->fh_socket, sockaddr, optlen);
int result = (getsockname)(fh->fh_socket, sockaddr, optlen);
if (result == SOCKET_ERROR) {
const DWORD err = WSAGetLastError();
D("adb_getsockname: setsockopt on fd %d failed: %s\n", fd,
Expand Down Expand Up @@ -1119,6 +1119,11 @@ int adb_socketpair(int sv[2]) {
int local_port = -1;
std::string error;

struct sockaddr_storage peer_addr = {};
struct sockaddr_storage client_addr = {};
socklen_t peer_socklen = sizeof(peer_addr);
socklen_t client_socklen = sizeof(client_addr);

server = network_loopback_server(0, SOCK_STREAM, &error);
if (server < 0) {
D("adb_socketpair: failed to create server: %s", error.c_str());
Expand All @@ -1138,12 +1143,32 @@ int adb_socketpair(int sv[2]) {
goto fail;
}

accepted = adb_socket_accept(server, nullptr, nullptr);
// Make sure that the peer that connected to us and the client are the same.
accepted = adb_socket_accept(server, reinterpret_cast<sockaddr*>(&peer_addr), &peer_socklen);
if (accepted < 0) {
D("adb_socketpair: failed to accept: %s", strerror(errno));
goto fail;
}

if (adb_getsockname(client, reinterpret_cast<sockaddr*>(&client_addr), &client_socklen) != 0) {
D("adb_socketpair: failed to getpeername: %s", strerror(errno));
goto fail;
}

if (peer_socklen != client_socklen) {
D("adb_socketpair: client and peer sockaddrs have different lengths");
errno = EIO;
goto fail;
}

if (memcmp(&peer_addr, &client_addr, peer_socklen) != 0) {
D("adb_socketpair: client and peer sockaddrs don't match");
errno = EIO;
goto fail;
}

adb_close(server);

sv[0] = client;
sv[1] = accepted;
return 0;
Expand Down

0 comments on commit 5990191

Please sign in to comment.