]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Kill TCP connections if getsockname fails
authorAndreas Schneider <asn@samba.org>
Tue, 30 May 2017 07:50:10 +0000 (09:50 +0200)
committerGreg Hudson <ghudson@mit.edu>
Mon, 5 Jun 2017 15:56:34 +0000 (11:56 -0400)
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]

src/kadmin/server/schpw.c
src/lib/apputils/net-server.c

index 282305744216638a7a4c8494b3336ba33e1c878e..d89d246b1c9090852bb64494cc7dc01b423f4bd4 100644 (file)
@@ -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) {
@@ -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);
 }
index f0b7a38b0e1b988baa75eec19813a009ea067e69..ee3d743f19b8056ce08716712f6c4d63c1494b02 100644 (file)
@@ -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),
@@ -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);
     }