mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 15:45:25 +00:00
isc_sockaddr_t now has a length; dev->result was not set in internal_connect()
This commit is contained in:
@@ -157,7 +157,6 @@ struct isc_socket {
|
|||||||
rwintev_t *wiev; /* allocated send intev */
|
rwintev_t *wiev; /* allocated send intev */
|
||||||
cnintev_t *ciev; /* allocated accept intev */
|
cnintev_t *ciev; /* allocated accept intev */
|
||||||
isc_sockaddr_t address; /* remote address */
|
isc_sockaddr_t address; /* remote address */
|
||||||
int addrlength; /* remote addrlen */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SOCKET_MANAGER_MAGIC 0x494f6d67U /* IOmg */
|
#define SOCKET_MANAGER_MAGIC 0x494f6d67U /* IOmg */
|
||||||
@@ -395,8 +394,6 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
|
|||||||
|
|
||||||
ISC_LIST_INIT(sock->accept_list);
|
ISC_LIST_INIT(sock->accept_list);
|
||||||
|
|
||||||
sock->addrlength = 0;
|
|
||||||
|
|
||||||
sock->recv_result = ISC_R_SUCCESS;
|
sock->recv_result = ISC_R_SUCCESS;
|
||||||
sock->send_result = ISC_R_SUCCESS;
|
sock->send_result = ISC_R_SUCCESS;
|
||||||
|
|
||||||
@@ -778,7 +775,6 @@ internal_accept(isc_task_t *task, isc_event_t *ev)
|
|||||||
isc_socketmgr_t *manager;
|
isc_socketmgr_t *manager;
|
||||||
isc_socket_newconnev_t *dev;
|
isc_socket_newconnev_t *dev;
|
||||||
intev_t *iev = (intev_t *)ev;
|
intev_t *iev = (intev_t *)ev;
|
||||||
struct sockaddr addr;
|
|
||||||
ISC_SOCKADDR_LEN_T addrlen;
|
ISC_SOCKADDR_LEN_T addrlen;
|
||||||
int fd;
|
int fd;
|
||||||
isc_result_t result = ISC_R_SUCCESS;
|
isc_result_t result = ISC_R_SUCCESS;
|
||||||
@@ -828,8 +824,9 @@ internal_accept(isc_task_t *task, isc_event_t *ev)
|
|||||||
* EAGAIN or EINTR, simply poke the watcher to watch this socket
|
* EAGAIN or EINTR, simply poke the watcher to watch this socket
|
||||||
* again.
|
* again.
|
||||||
*/
|
*/
|
||||||
addrlen = sizeof(addr);
|
addrlen = sizeof dev->newsocket->address.type;
|
||||||
fd = accept(sock->fd, &addr, &addrlen);
|
fd = accept(sock->fd, &dev->newsocket->address.type.sa, &addrlen);
|
||||||
|
dev->newsocket->address.length = addrlen;
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
if (SOFT_ERROR(errno)) {
|
if (SOFT_ERROR(errno)) {
|
||||||
select_poke(sock->manager, sock->fd);
|
select_poke(sock->manager, sock->fd);
|
||||||
@@ -886,10 +883,7 @@ internal_accept(isc_task_t *task, isc_event_t *ev)
|
|||||||
/*
|
/*
|
||||||
* Save away the remote address
|
* Save away the remote address
|
||||||
*/
|
*/
|
||||||
dev->newsocket->addrlength = addrlen;
|
dev->address = dev->newsocket->address;
|
||||||
memcpy(&dev->newsocket->address, &addr, addrlen);
|
|
||||||
dev->addrlength = addrlen;
|
|
||||||
memcpy(&dev->address, &addr, addrlen);
|
|
||||||
|
|
||||||
LOCK(&manager->lock);
|
LOCK(&manager->lock);
|
||||||
manager->fds[fd] = dev->newsocket;
|
manager->fds[fd] = dev->newsocket;
|
||||||
@@ -923,7 +917,6 @@ internal_recv(isc_task_t *task, isc_event_t *ev)
|
|||||||
isc_socket_t *sock;
|
isc_socket_t *sock;
|
||||||
int cc;
|
int cc;
|
||||||
size_t read_count;
|
size_t read_count;
|
||||||
struct sockaddr addr;
|
|
||||||
ISC_SOCKADDR_LEN_T addrlen;
|
ISC_SOCKADDR_LEN_T addrlen;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -981,26 +974,18 @@ internal_recv(isc_task_t *task, isc_event_t *ev)
|
|||||||
*/
|
*/
|
||||||
read_count = dev->region.length - dev->n;
|
read_count = dev->region.length - dev->n;
|
||||||
if (sock->type == isc_socket_udp) {
|
if (sock->type == isc_socket_udp) {
|
||||||
addrlen = sizeof(addr);
|
addrlen = sizeof dev->address.type;
|
||||||
cc = recvfrom(sock->fd,
|
cc = recvfrom(sock->fd,
|
||||||
ISC_SOCKDATA_CAST(dev->region.base
|
ISC_SOCKDATA_CAST(dev->region.base
|
||||||
+ dev->n),
|
+ dev->n),
|
||||||
read_count, 0,
|
read_count, 0,
|
||||||
(struct sockaddr *)&addr,
|
&dev->address.type.sa, &addrlen);
|
||||||
&addrlen);
|
dev->address.length = addrlen;
|
||||||
if (cc >= 0) {
|
|
||||||
memcpy(&dev->address, &addr, addrlen);
|
|
||||||
dev->addrlength = addrlen;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
cc = recv(sock->fd,
|
cc = recv(sock->fd,
|
||||||
ISC_SOCKDATA_CAST(dev->region.base + dev->n),
|
ISC_SOCKDATA_CAST(dev->region.base + dev->n),
|
||||||
read_count, 0);
|
read_count, 0);
|
||||||
if (cc >= 0) {
|
dev->address = sock->address;
|
||||||
memcpy(&dev->address, &sock->address,
|
|
||||||
(size_t)sock->addrlength);
|
|
||||||
dev->addrlength = sock->addrlength;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XTRACE(TRACE_RECV,
|
XTRACE(TRACE_RECV,
|
||||||
@@ -1182,8 +1167,8 @@ internal_send(isc_task_t *task, isc_event_t *ev)
|
|||||||
ISC_SOCKDATA_CAST(dev->region.base
|
ISC_SOCKDATA_CAST(dev->region.base
|
||||||
+ dev->n),
|
+ dev->n),
|
||||||
write_count, 0,
|
write_count, 0,
|
||||||
(struct sockaddr *)&dev->address,
|
&dev->address.type.sa,
|
||||||
(int)dev->addrlength);
|
(int)dev->address.length);
|
||||||
|
|
||||||
else
|
else
|
||||||
cc = send(sock->fd,
|
cc = send(sock->fd,
|
||||||
@@ -1731,14 +1716,14 @@ isc_socket_recv(isc_socket_t *sock, isc_region_t *region,
|
|||||||
if (EMPTY(sock->recv_list)) {
|
if (EMPTY(sock->recv_list)) {
|
||||||
if (sock->type == isc_socket_udp) {
|
if (sock->type == isc_socket_udp) {
|
||||||
ISC_SOCKADDR_LEN_T addrlen;
|
ISC_SOCKADDR_LEN_T addrlen;
|
||||||
dev->addrlength = sizeof(isc_sockaddr_t);
|
|
||||||
addrlen = (ISC_SOCKADDR_LEN_T)dev->addrlength;
|
addrlen = (ISC_SOCKADDR_LEN_T)
|
||||||
|
(sizeof dev->address.type);
|
||||||
cc = recvfrom(sock->fd,
|
cc = recvfrom(sock->fd,
|
||||||
ISC_SOCKDATA_CAST(dev->region.base),
|
ISC_SOCKDATA_CAST(dev->region.base),
|
||||||
dev->region.length, 0,
|
dev->region.length, 0,
|
||||||
(struct sockaddr *)&dev->address,
|
&dev->address.type.sa, &addrlen);
|
||||||
&addrlen);
|
dev->address.length = (unsigned int)addrlen;
|
||||||
dev->addrlength = (unsigned int)addrlen;
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* recv() is used on TCP sockets, since some OSs
|
* recv() is used on TCP sockets, since some OSs
|
||||||
@@ -1750,7 +1735,6 @@ isc_socket_recv(isc_socket_t *sock, isc_region_t *region,
|
|||||||
ISC_SOCKDATA_CAST(dev->region.base),
|
ISC_SOCKDATA_CAST(dev->region.base),
|
||||||
dev->region.length, 0);
|
dev->region.length, 0);
|
||||||
dev->address = sock->address;
|
dev->address = sock->address;
|
||||||
dev->addrlength = sock->addrlength;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc < 0) {
|
if (cc < 0) {
|
||||||
@@ -1861,20 +1845,19 @@ isc_result_t
|
|||||||
isc_socket_send(isc_socket_t *sock, isc_region_t *region,
|
isc_socket_send(isc_socket_t *sock, isc_region_t *region,
|
||||||
isc_task_t *task, isc_taskaction_t action, void *arg)
|
isc_task_t *task, isc_taskaction_t action, void *arg)
|
||||||
{
|
{
|
||||||
return (isc_socket_sendto(sock, region, task, action, arg, NULL, 0));
|
return (isc_socket_sendto(sock, region, task, action, arg, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
|
isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
|
||||||
isc_task_t *task, isc_taskaction_t action, void *arg,
|
isc_task_t *task, isc_taskaction_t action, void *arg,
|
||||||
isc_sockaddr_t *address, unsigned int addrlen)
|
isc_sockaddr_t *address)
|
||||||
{
|
{
|
||||||
isc_socketevent_t *dev;
|
isc_socketevent_t *dev;
|
||||||
rwintev_t *iev;
|
rwintev_t *iev;
|
||||||
isc_socketmgr_t *manager;
|
isc_socketmgr_t *manager;
|
||||||
isc_task_t *ntask = NULL;
|
isc_task_t *ntask = NULL;
|
||||||
int cc;
|
int cc;
|
||||||
ISC_SOCKADDR_LEN_T addrlength = (ISC_SOCKADDR_LEN_T)addrlen;
|
|
||||||
|
|
||||||
REQUIRE(VALID_SOCKET(sock));
|
REQUIRE(VALID_SOCKET(sock));
|
||||||
|
|
||||||
@@ -1919,19 +1902,13 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
|
|||||||
* If the write queue is empty, try to do the I/O right now.
|
* If the write queue is empty, try to do the I/O right now.
|
||||||
*/
|
*/
|
||||||
if (sock->type == isc_socket_udp) {
|
if (sock->type == isc_socket_udp) {
|
||||||
INSIST(addrlength > 0 || sock->addrlength > 0);
|
if (address != NULL)
|
||||||
if (addrlength > 0) {
|
|
||||||
dev->address = *address;
|
dev->address = *address;
|
||||||
dev->addrlength = addrlength;
|
else
|
||||||
} else if (sock->addrlength > 0) {
|
|
||||||
dev->address = sock->address;
|
dev->address = sock->address;
|
||||||
dev->addrlength = sock->addrlength;
|
|
||||||
}
|
|
||||||
} else if (sock->type == isc_socket_tcp) {
|
} else if (sock->type == isc_socket_tcp) {
|
||||||
INSIST(address == NULL);
|
INSIST(address == NULL);
|
||||||
INSIST(addrlength == 0);
|
|
||||||
dev->address = sock->address;
|
dev->address = sock->address;
|
||||||
dev->addrlength = sock->addrlength;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EMPTY(sock->send_list)) {
|
if (EMPTY(sock->send_list)) {
|
||||||
@@ -1939,8 +1916,8 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
|
|||||||
cc = sendto(sock->fd,
|
cc = sendto(sock->fd,
|
||||||
ISC_SOCKDATA_CAST(dev->region.base),
|
ISC_SOCKDATA_CAST(dev->region.base),
|
||||||
dev->region.length, 0,
|
dev->region.length, 0,
|
||||||
(struct sockaddr *)&dev->address,
|
&dev->address.type.sa,
|
||||||
(int)dev->addrlength);
|
(int)dev->address.length);
|
||||||
else if (sock->type == isc_socket_tcp)
|
else if (sock->type == isc_socket_tcp)
|
||||||
cc = send(sock->fd,
|
cc = send(sock->fd,
|
||||||
ISC_SOCKDATA_CAST(dev->region.base),
|
ISC_SOCKDATA_CAST(dev->region.base),
|
||||||
@@ -2043,8 +2020,7 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
|
|||||||
}
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
|
isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr)
|
||||||
int addrlen)
|
|
||||||
{
|
{
|
||||||
int on = 1;
|
int on = 1;
|
||||||
|
|
||||||
@@ -2056,7 +2032,7 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
|
|||||||
sock->fd);
|
sock->fd);
|
||||||
/* Press on... */
|
/* Press on... */
|
||||||
}
|
}
|
||||||
if (bind(sock->fd, (struct sockaddr *)sockaddr, addrlen) < 0) {
|
if (bind(sock->fd, &sockaddr->type.sa, sockaddr->length) < 0) {
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
case EACCES:
|
case EACCES:
|
||||||
@@ -2194,7 +2170,7 @@ isc_socket_accept(isc_socket_t *sock,
|
|||||||
}
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, int addrlen,
|
isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
|
||||||
isc_task_t *task, isc_taskaction_t action, void *arg)
|
isc_task_t *task, isc_taskaction_t action, void *arg)
|
||||||
{
|
{
|
||||||
isc_socket_connev_t *dev;
|
isc_socket_connev_t *dev;
|
||||||
@@ -2244,8 +2220,7 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, int addrlen,
|
|||||||
* outstanding, and it might happen to complete.
|
* outstanding, and it might happen to complete.
|
||||||
*/
|
*/
|
||||||
sock->address = *addr;
|
sock->address = *addr;
|
||||||
sock->addrlength = addrlen;
|
cc = connect(sock->fd, &addr->type.sa, addr->length);
|
||||||
cc = connect(sock->fd, (struct sockaddr *)addr, addrlen);
|
|
||||||
if (cc < 0) {
|
if (cc < 0) {
|
||||||
if (SOFT_ERROR(errno) || errno == EINPROGRESS)
|
if (SOFT_ERROR(errno) || errno == EINPROGRESS)
|
||||||
goto queue;
|
goto queue;
|
||||||
@@ -2400,7 +2375,8 @@ internal_connect(isc_task_t *task, isc_event_t *ev)
|
|||||||
strerror(errno));
|
strerror(errno));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
|
dev->result = ISC_R_SUCCESS;
|
||||||
|
|
||||||
|
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
@@ -2412,22 +2388,14 @@ internal_connect(isc_task_t *task, isc_event_t *ev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp,
|
isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp)
|
||||||
int *lengthp)
|
|
||||||
{
|
{
|
||||||
REQUIRE(VALID_SOCKET(sock));
|
REQUIRE(VALID_SOCKET(sock));
|
||||||
REQUIRE(addressp != NULL);
|
REQUIRE(addressp != NULL);
|
||||||
REQUIRE(lengthp != NULL);
|
|
||||||
|
|
||||||
LOCK(&sock->lock);
|
LOCK(&sock->lock);
|
||||||
|
|
||||||
if (*lengthp < sock->addrlength) {
|
*addressp = sock->address;
|
||||||
UNLOCK(&sock->lock);
|
|
||||||
return (ISC_R_NOSPACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(addressp, &sock->address, (size_t)sock->addrlength);
|
|
||||||
*lengthp = sock->addrlength;
|
|
||||||
|
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
|
|
||||||
@@ -2435,33 +2403,23 @@ isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp,
|
isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp)
|
||||||
int *lengthp)
|
|
||||||
{
|
{
|
||||||
isc_sockaddr_t addr;
|
|
||||||
ISC_SOCKADDR_LEN_T len;
|
ISC_SOCKADDR_LEN_T len;
|
||||||
|
|
||||||
REQUIRE(VALID_SOCKET(sock));
|
REQUIRE(VALID_SOCKET(sock));
|
||||||
REQUIRE(addressp != NULL);
|
REQUIRE(addressp != NULL);
|
||||||
REQUIRE(lengthp != NULL);
|
|
||||||
|
|
||||||
LOCK(&sock->lock);
|
LOCK(&sock->lock);
|
||||||
|
|
||||||
len = sizeof(addr);
|
len = sizeof addressp->type;
|
||||||
if (getsockname(sock->fd, (struct sockaddr *)&addr, &len) < 0) {
|
if (getsockname(sock->fd, &addressp->type.sa, &len) < 0) {
|
||||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||||
"getsockname: %s", strerror(errno));
|
"getsockname: %s", strerror(errno));
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
return (ISC_R_UNEXPECTED);
|
return (ISC_R_UNEXPECTED);
|
||||||
}
|
}
|
||||||
|
addressp->length = (unsigned int)len;
|
||||||
if ((unsigned int)*lengthp < (unsigned int)len) {
|
|
||||||
UNLOCK(&sock->lock);
|
|
||||||
return (ISC_R_NOSPACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(addressp, &sock->address, (size_t)len);
|
|
||||||
*lengthp = (unsigned int)len;
|
|
||||||
|
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user