[comp.protocols.kerberos] Nasty gotcha in krb_recvauth

john@iastate.edu (John Paul Hascall) (01/21/91)

Imagine you have a client and a server which have managed to get a
socket connected between themselves.  The server does krb_recvauth()
expecting the client to do krb_sendauth(), but, for whatever reason,
the client exits closing the socket.  Now krb_recvauth() returns
KSUCCESS which is clearly inappropriate.

How does this happen, you ask?
In rather rough pseudo-code:

    krb_sendauth(...) {
        if (krb_net_read(...nbytes) != nbytes) {
            return (errno);
        }
        :
    }

    krb_net_read() does a read(), returns the number of bytes read,
    the test fails and it returns errno.  Only two problems:

        1) errno, having not been set, is still zero

        2) KSUCCESS is also zero

A work-around:

    ticket.length = 0;
    kstat = krb_recvauth(... &ticket, ...);
    if ((kstat == 0) && (ticket.length == 0)) kstat = RD_AP_UNDEC;

Of course, the right way to fix it would be to do something like this:

     if (krb_net_read(...nbytes) != nbytes) {
         return ((errno != 0) ? errno : RD_AP_UNDEC);
     }

in the appropriate locations in krb_recvauth().


--john

--
John Hascall                        An ill-chosen word is the fool's messenger.
Project Vincent
Iowa State University Computation Center                       john@iastate.edu
Ames, IA  50011                                                  (515) 294-9551