Skip to content

Commit

Permalink
Kill TCP connections if getsockname fails
Browse files Browse the repository at this point in the history
In net-server.c:process_tcp_connection_read(), we don't expect
getsockname() to fail under ordinary circumstances, so instead of
passing a null local address to dispatch(), just error out.  Simplify
schpw.c:dispatch() by assuming a non-null local_saddr.

[ghudson@mit.edu: simplified schpw.c:dispatch(); rewrote commit
message]
  • Loading branch information
cryptomilk authored and greghudson committed Jun 5, 2017
1 parent 7e41d97 commit 342d51e
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 17 deletions.
16 changes: 3 additions & 13 deletions src/kadmin/server/schpw.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,20 +444,11 @@ dispatch(void *handle, struct sockaddr *local_saddr,
krb5_keytab kt = NULL;
kadm5_server_handle_t server_handle = (kadm5_server_handle_t)handle;
krb5_fulladdr local_faddr;
krb5_address **local_kaddrs = NULL, local_kaddr_buf;
krb5_address local_kaddr_buf;
krb5_data *response = NULL;

if (local_saddr == NULL) {
ret = krb5_os_localaddr(server_handle->context, &local_kaddrs);
if (ret != 0)
goto egress;

local_faddr.address = local_kaddrs[0];
local_faddr.port = 0;
} else {
local_faddr.address = &local_kaddr_buf;
init_addr(&local_faddr, local_saddr);
}
local_faddr.address = &local_kaddr_buf;
init_addr(&local_faddr, local_saddr);

ret = krb5_kt_resolve(server_handle->context, "KDB:", &kt);
if (ret != 0) {
Expand All @@ -481,7 +472,6 @@ dispatch(void *handle, struct sockaddr *local_saddr,
egress:
if (ret)
krb5_free_data(server_handle->context, response);
krb5_free_addresses(server_handle->context, local_kaddrs);
krb5_kt_close(server_handle->context, kt);
(*respond)(arg, ret, ret == 0 ? response : NULL);
}
10 changes: 6 additions & 4 deletions src/lib/apputils/net-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -1329,7 +1329,6 @@ process_tcp_connection_read(verto_ctx *ctx, verto_ev *ev)
} else {
/* msglen known. */
socklen_t local_saddrlen = sizeof(struct sockaddr_storage);
struct sockaddr *local_saddrp = NULL;

len = conn->msglen - (conn->offset - 4);
nread = SOCKET_READ(verto_get_fd(ev),
Expand All @@ -1351,10 +1350,13 @@ process_tcp_connection_read(verto_ctx *ctx, verto_ev *ev)
state->request.data = conn->buffer + 4;

if (getsockname(verto_get_fd(ev), ss2sa(&state->local_saddr),
&local_saddrlen) == 0)
local_saddrp = ss2sa(&state->local_saddr);
&local_saddrlen) < 0) {
krb5_klog_syslog(LOG_ERR, _("getsockname failed: %s"),
error_message(errno));
goto kill_tcp_connection;
}

dispatch(state->conn->handle, local_saddrp, &conn->faddr,
dispatch(state->conn->handle, ss2sa(&state->local_saddr), &conn->faddr,
&state->request, 1, ctx, process_tcp_response, state);
}

Expand Down

0 comments on commit 342d51e

Please sign in to comment.