Streamline responding to accept(), connect() calls

Changes:

    * Implement and use respond_accept() and respond_connect()
      convenience methods instead of stack allocating response objects,
      populating them, and using write() to send them to the client

    * When receiving XID frames in response to either an accept() or
      connect() call, respond to the client if any of the parameters
      sent from the peer are not compatible with a socket or interface,
      with the appropriate errno value
This commit is contained in:
XANTRONIX Development 2020-07-24 21:35:40 -04:00 committed by XANTRONIX Industrial
parent 1a87ac3858
commit 971fc2c375

View file

@ -502,8 +502,39 @@ int patty_ax25_server_add_route(patty_ax25_server *server,
return patty_ax25_route_table_add(server->routes, route);
}
static int server_socket(patty_ax25_server *server,
int client) {
static int respond_accept(int client,
int ret,
int eno,
patty_ax25_addr *peer,
char *path) {
patty_ax25_call_accept_response response;
memset(&response, '\0', sizeof(response));
response.ret = ret;
response.eno = eno;
if (peer) {
memcpy(&response.peer, peer, sizeof(response.peer));
}
if (path) {
strncpy(response.path, path, sizeof(response.path));
}
return write(client, &response, sizeof(response));
}
static int respond_connect(int client, int ret, int eno) {
patty_ax25_call_connect_response response = {
.ret = ret,
.eno = eno
};
return write(client, &response, sizeof(response));
}
static int server_socket(patty_ax25_server *server, int client) {
patty_ax25_call_socket_request request;
patty_ax25_call_socket_response response;
@ -697,8 +728,6 @@ error_io:
static int server_accept(patty_ax25_server *server,
int client) {
patty_ax25_call_accept_request request;
patty_ax25_call_accept_response response;
patty_ax25_sock *sock;
if (read(client, &request, sizeof(request)) < 0) {
@ -706,16 +735,13 @@ static int server_accept(patty_ax25_server *server,
}
if ((sock = sock_by_fd(server->socks_by_fd, request.fd)) == NULL) {
response.ret = -1;
response.eno = EBADF;
goto error_sock_by_fd;
}
return 0;
error_sock_by_fd:
return write(client, &response, sizeof(response));
return respond_accept(client, -1, EBADF, NULL, NULL);
error_io:
return -1;
@ -724,7 +750,6 @@ error_io:
static int server_connect(patty_ax25_server *server,
int client) {
patty_ax25_call_connect_request request;
patty_ax25_call_connect_response response;
patty_ax25_sock *sock;
patty_ax25_route *route;
@ -735,28 +760,15 @@ static int server_connect(patty_ax25_server *server,
}
if ((sock = sock_by_fd(server->socks_by_fd, request.fd)) == NULL) {
response.ret = -1;
response.eno = EBADF;
goto error_sock_by_fd;
return respond_connect(client, -1, EBADF);
}
switch (sock->status) {
case PATTY_AX25_SOCK_LISTENING:
response.ret = -1;
response.eno = EINVAL;
goto error_invalid_status;
break;
return respond_connect(client, -1, EINVAL);
case PATTY_AX25_SOCK_ESTABLISHED:
response.ret = -1;
response.eno = EISCONN;
goto error_invalid_status;
break;
return respond_connect(client, -1, EISCONN);
default:
break;
@ -780,10 +792,7 @@ static int server_connect(patty_ax25_server *server,
* configured.
*/
if (route == NULL) {
response.ret = -1;
response.eno = ENETDOWN;
goto error_network_down;
return respond_connect(client, -1, ENETDOWN);
}
patty_ax25_sock_bind_if(sock, iface = route->iface);
@ -816,10 +825,7 @@ static int server_connect(patty_ax25_server *server,
* parameters.
*/
if (patty_ax25_sock_send_xid(sock, PATTY_AX25_FRAME_COMMAND) < 0) {
response.ret = -1;
response.eno = errno;
goto error_sock_send_xid;
return respond_connect(client, -1, errno);
}
/*
@ -829,12 +835,6 @@ static int server_connect(patty_ax25_server *server,
*/
return 0;
error_sock_send_xid:
error_network_down:
error_invalid_status:
error_sock_by_fd:
return write(client, &response, sizeof(response));
error_client_save_by_sock:
error_sock_save_remote:
error_io:
@ -1157,7 +1157,6 @@ static int handle_sabm(patty_ax25_server *server,
created = 0;
patty_ax25_sock *local, *remote;
patty_ax25_call_accept_response response;
if ((local = sock_by_addr(server->socks_local,
&frame->dest)) == NULL) {
@ -1202,17 +1201,13 @@ static int handle_sabm(patty_ax25_server *server,
fd_watch(server, remote->fd);
memset(&response, '\0', sizeof(response));
memcpy(&response.peer, &frame->src, sizeof(patty_ax25_addr));
memcpy(&response.path, &remote->path, sizeof(response.path));
if (write(client, &response, sizeof(response)) < 0) {
goto error_write;
if (respond_accept(client, 0, 0, &frame->src, remote->path) < 0) {
goto error_respond_accept;
}
return reply_ua(iface, frame, PATTY_AX25_FRAME_FINAL);
error_write:
error_respond_accept:
error_sock_save:
patty_ax25_sock_destroy(remote);
@ -1226,7 +1221,6 @@ static int handle_ua(patty_ax25_server *server,
patty_ax25_sock *sock,
patty_ax25_frame *frame) {
int client;
patty_ax25_call_connect_response response;
if (sock == NULL) {
return reply_dm(iface, frame, PATTY_AX25_FRAME_FINAL);
@ -1258,16 +1252,8 @@ static int handle_ua(patty_ax25_server *server,
fd_watch(server, sock->fd);
response.ret = 0;
response.eno = 0;
return respond_connect(client, 0, 0);
if (write(client, &response, sizeof(response)) < 0) {
goto error_write;
}
return 0;
error_write:
error_sock_save:
patty_ax25_sock_destroy(sock);
@ -1280,7 +1266,6 @@ static int handle_dm(patty_ax25_server *server,
patty_ax25_sock *sock,
patty_ax25_frame *frame) {
int client;
patty_ax25_call_connect_response response;
if (sock == NULL || sock->status != PATTY_AX25_SOCK_PENDING_CONNECT) {
return 0;
@ -1290,18 +1275,10 @@ static int handle_dm(patty_ax25_server *server,
goto error_client_by_sock;
}
response.ret = -1;
response.eno = ECONNREFUSED;
patty_ax25_sock_reset(sock);
if (write(client, &response, sizeof(response)) < 0) {
goto error_write;
}
return respond_connect(client, -1, ECONNREFUSED);
return 0;
error_write:
error_client_by_sock:
return -1;
}
@ -1435,7 +1412,15 @@ static int handle_xid(patty_ax25_server *server,
}
if (patty_ax25_sock_params_set(remote, &params) < 0) {
goto error_sock_params_set;
int client;
if ((client = client_by_sock(server, remote)) < 0) {
goto error_client_by_sock;
}
patty_ax25_sock_reset(remote);
return respond_connect(client, -1, errno);
}
/*
@ -1483,7 +1468,9 @@ static int handle_xid(patty_ax25_server *server,
patty_ax25_sock_upgrade(remote);
if (patty_ax25_sock_params_set(remote, &params) < 0) {
goto error_sock_params_set;
patty_ax25_sock_destroy(remote);
return respond_accept(client, -1, errno, NULL, NULL);
}
save_reply_addr(remote, frame);
@ -1501,7 +1488,6 @@ reply_dm:
error_sock_save:
error_sock_new:
error_client_by_sock:
error_sock_params_set:
error_sock_upgrade:
error_io:
return -1;