[385] in Kerberos-V5-bugs
bug in krb5_copy_addresses
tytso@ATHENA.MIT.EDU (tytso@ATHENA.MIT.EDU)
Mon Nov 15 23:49:26 1993
Date: Mon, 8 Nov 93 20:03:20 -0600
Received: by NeXT.Mailer (1.87.1.RR)
Received: by NeXT Mailer (1.87.1.RR)
To: krb5-bugs@MIT.EDU
Subject: bug in krb5_copy_addresses
Cc: kerberos@MIT.EDU
Reply-To: Jim_Miller@suite.com
This is for Kerberos 5, pre-beta 3...
There is a bug in the routine krb5_copy_addresses (lib/krb/copy_addrs.c)
Here's the code:
    for (nelems = 0; inaddr[nelems]; nelems++)
	retval = krb5_copy_addr(inaddr[nelems], &tempaddr[nelems]);
        if (retval) {
	    krb5_free_addresses(tempaddr);
	    return retval;
	}
Notice that it looks like the "if (retval)" is supposed to be part of the "for"  
loop.  However, the "for" loop does not have any braces "{", therefore only the  
call to "krb5_copy_addr" is part of the loop.  Rearranged, the code is  
really...
    for (nelems = 0; inaddr[nelems]; nelems++)
	retval = krb5_copy_addr(inaddr[nelems], &tempaddr[nelems]);
    if (retval) {
	krb5_free_addresses(tempaddr);
	return retval;
    }
If "inaddr[nelems]" is null, (i.e. there are no addresses to copy), the routine  
returns a "retval" that has not been set to any meaningful value.
Suggested fix:
!    for (nelems = 0; inaddr[nelems]; nelems++) {
	retval = krb5_copy_addr(inaddr[nelems], &tempaddr[nelems]);
        if (retval) {
	    krb5_free_addresses(tempaddr);
	    return retval;
	}
+    }
Jim_Miller@suite.com