Nalin Dahyabhai 222449e
Tweaked for 1.11.3.
Nalin Dahyabhai 222449e
Nalin Dahyabhai 222449e
commit 53e5c850e05f011e9e7f25c2032aec51d8b352a9
Nalin Dahyabhai 222449e
Author: Viktor Dukhovni <viktor@twosigma.com>
Nalin Dahyabhai 222449e
Date:   Tue Jun 25 12:27:42 2013 -0400
Nalin Dahyabhai 222449e
Nalin Dahyabhai 222449e
    Fix spin loop reading from KDC TCP socket
Nalin Dahyabhai 222449e
    
Nalin Dahyabhai 222449e
    In the k5_sendto code for reading from a TCP socket, detect
Nalin Dahyabhai 222449e
    end-of-stream when reading the length.  Otherwise we can get stuck in
Nalin Dahyabhai 222449e
    an infinite loop of poll() and read().
Nalin Dahyabhai 222449e
    
Nalin Dahyabhai 222449e
    [ghudson@mit.edu: commit message]
Nalin Dahyabhai 222449e
    
Nalin Dahyabhai 222449e
    ticket: 7508
Nalin Dahyabhai 222449e
    target_version: 1.11.4
Nalin Dahyabhai 222449e
    tags: pullup
Nalin Dahyabhai 222449e
Nalin Dahyabhai 222449e
diff --git a/src/lib/krb5/os/sendto_kdc.c b/src/lib/krb5/os/sendto_kdc.c
Nalin Dahyabhai 222449e
index 3e4ec7e..3c31d9f 100644
Nalin Dahyabhai 222449e
--- a/src/lib/krb5/os/sendto_kdc.c
Nalin Dahyabhai 222449e
+++ b/src/lib/krb5/os/sendto_kdc.c
Nalin Dahyabhai 222449e
@@ -853,9 +853,9 @@ service_tcp_fd(krb5_context context, struct conn_state *conn,
Nalin Dahyabhai 222449e
             nread = SOCKET_READ(conn->fd,
Nalin Dahyabhai 222449e
                                 conn->x.in.bufsizebytes + conn->x.in.bufsizebytes_read,
Nalin Dahyabhai 222449e
                                 4 - conn->x.in.bufsizebytes_read);
Nalin Dahyabhai 222449e
-            if (nread < 0) {
Nalin Dahyabhai 222449e
+            if (nread <= 0) {
Nalin Dahyabhai 222449e
+                e = nread ? SOCKET_ERRNO : ECONNRESET;
Nalin Dahyabhai 222449e
                 TRACE_SENDTO_KDC_TCP_ERROR_RECV_LEN(context, conn, e);
Nalin Dahyabhai 222449e
-                e = SOCKET_ERRNO;
Nalin Dahyabhai 222449e
                 goto kill_conn;
Nalin Dahyabhai 222449e
             }
Nalin Dahyabhai 222449e
             conn->x.in.bufsizebytes_read += nread;