|
|
|
@ -49,6 +49,7 @@ static void do_init(void) __attribute__((constructor)); |
|
|
|
static void do_exit(void) __attribute__((destructor)); |
|
|
|
|
|
|
|
static socklen_t anon_addr(int domain, struct sockaddr_storage *sst, unsigned int id, unsigned int id2); |
|
|
|
static const struct sockaddr *addr_find(const struct sockaddr *addr, socklen_t *addrlen); |
|
|
|
|
|
|
|
static void do_init(void) { |
|
|
|
setenv("RTPE_PRELOAD_TEST_ACTIVE", "1", 1); |
|
|
|
@ -533,22 +534,29 @@ int connect(int fd, const struct sockaddr *addr, socklen_t addrlen) { |
|
|
|
assert(s->used_domain == AF_UNIX); |
|
|
|
assert(s->wanted_domain == addr->sa_family); |
|
|
|
|
|
|
|
struct sockaddr_un sun; |
|
|
|
err = addr_translate(&sun, addr, addrlen, s->type, 1, 0); |
|
|
|
if (err) { |
|
|
|
if (!err[0]) |
|
|
|
goto do_connect; |
|
|
|
goto do_connect_warn; |
|
|
|
} |
|
|
|
|
|
|
|
struct sockaddr_storage sst = {0,}; |
|
|
|
if (addrlen > sizeof(sst)) |
|
|
|
goto do_connect_warn; |
|
|
|
memcpy(&sst, addr, addrlen); |
|
|
|
s->peername = sst; |
|
|
|
|
|
|
|
addr = (void *) &sun; |
|
|
|
addrlen = sizeof(sun); |
|
|
|
struct sockaddr_un sun; |
|
|
|
|
|
|
|
const struct sockaddr *anon_addr = addr_find(addr, &addrlen); |
|
|
|
if (anon_addr) |
|
|
|
addr = anon_addr; |
|
|
|
else { |
|
|
|
err = addr_translate(&sun, addr, addrlen, s->type, 1, 0); |
|
|
|
if (err) { |
|
|
|
if (!err[0]) |
|
|
|
goto do_connect; |
|
|
|
goto do_connect_warn; |
|
|
|
} |
|
|
|
|
|
|
|
addr = (void *) &sun; |
|
|
|
addrlen = sizeof(sun); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
goto do_connect; |
|
|
|
|
|
|
|
|