--- etc/afpd/auth.c.orig Sat Mar 15 07:03:18 1997 +++ etc/afpd/auth.c Thu Nov 11 16:35:34 1999 @@ -4,18 +4,22 @@ */ #include +#include +#include #include #include #include #include +#include +#include #include #include #include #include #include #include +#include #include -#include #include #include #include @@ -47,8 +51,8 @@ #include #endif SOLARIS -C_Block seskey; -Key_schedule seskeysched; +des_cblock *seskey; +des_key_schedule seskeysched; static char realm[ REALM_SZ ]; #endif KRB UAM_AFSKRB @@ -93,6 +97,7 @@ int ngroups; char *username = NULL; char *mktemp(); +int strndiacasecmp(); /* * These numbers are scattered throughout the code. @@ -100,6 +105,8 @@ struct afp_versions afp_versions[] = { { "AFPVersion 1.1", 11 }, { "AFPVersion 2.0", 20 }, + { "AFPVersion 2.1", 21 }, + { "AFP2.2", 22 } }; /* Note that these names must match those in main() */ @@ -120,6 +127,7 @@ /* * Mark a UAM as off. */ +void uam_off( uam ) char *uam; { @@ -134,6 +142,7 @@ return; } +void status_versions( data ) char *data; { @@ -147,12 +156,13 @@ for ( i = 0; i < num; i++ ) { len = strlen( afp_versions[ i ].av_name ); *data++ = len; - bcopy( afp_versions[ i ].av_name , data, len ); + memcpy( data, afp_versions[ i ].av_name, len ); data += len; } status->as_uamsoff = htons( data - (char *)status ); } +void status_uams( data ) char *data; { @@ -171,13 +181,14 @@ if (( afp_uams[ i ].au_flags & AU_OFF ) == 0 ) { len = strlen( afp_uams[ i ].au_name ); *data++ = len; - bcopy( afp_uams[ i ].au_name, data, len ); + memcpy( data, afp_uams[ i ].au_name, len ); data += len; } } status->as_iconoff = htons( data - (char *)status ); } +int afp_login( ibuf, ibuflen, rbuf, rbuflen ) char *ibuf, *rbuf; int ibuflen, *rbuflen; @@ -230,6 +241,7 @@ return( afp_uam->au_login( ibuf, ibuflen, rbuf, rbuflen )); } +int afp_logincont( ibuf, ibuflen, rbuf, rbuflen, asp ) char *ibuf, *rbuf; int ibuflen, *rbuflen; @@ -242,6 +254,7 @@ return( afp_uam->au_logincont( ibuf, ibuflen, rbuf, rbuflen, asp )); } +int noauth_login( ibuf, ibuflen, rbuf, rbuflen ) char *ibuf, *rbuf; int ibuflen, *rbuflen; @@ -275,6 +288,7 @@ return( AFP_OK ); } +int login( name, uid, gid ) char *name; uid_t uid; @@ -302,6 +316,7 @@ return( AFP_OK ); } +void lcase( p ) char *p; { @@ -313,6 +328,7 @@ return; } +void ucase( p ) char *p; { @@ -335,7 +351,7 @@ #define KRB4WRT_SKIP 7 #define KRB4RPL_DONEMUT 8 - +int krb4_login( ibuf, ibuflen, rbuf, rbuflen ) char *ibuf, *rbuf; int ibuflen, *rbuflen; @@ -360,7 +376,7 @@ *p++ = 1; len = strlen( realm ); *p++ = len; - strcpy( p, realm ); + (void)strlcpy( p, realm, sizeof(p) ); p += len + 1; #ifdef AFS @@ -375,6 +391,7 @@ return( AFPERR_AUTHCONT ); } +int krb4_logincont( ibuf, ibuflen, rbuf, rbuflen, asp ) char *ibuf, *rbuf; int ibuflen, *rbuflen; @@ -384,15 +401,15 @@ KTEXT_ST tkt; static AUTH_DAT ad; int rc; - short len; + int16_t len; char *p; - CREDENTIALS cr; #ifdef AFS + CREDENTIALS cr; struct ViceIoctl vi; struct ClearToken ct; -#endif AFS char buf[ 1024 ]; int aint; +#endif AFS if ( asp_wrtcont( asp, rbuf, rbuflen ) < 0 ) { *rbuflen = 0; @@ -403,15 +420,15 @@ switch ( rc = *p++ ) { case KRB4WRT_SESS : - bcopy( p, &len, sizeof( short )); + memcpy( &len, p, sizeof( len )); tkt.length = ntohs( len ); - p += sizeof( short ); + p += sizeof( len ); if ( tkt.length <= 0 || tkt.length > MAX_KTXT_LEN ) { *rbuflen = 0; return( AFPERR_BADUAM ); } - bcopy( p, tkt.dat, tkt.length ); + memcpy( tkt.dat, p, tkt.length ); p += tkt.length; if (( rc = krb_rd_req( &tkt, "afpserver", Obj, 0, &ad, "" )) @@ -424,7 +441,7 @@ syslog( LOG_INFO, "krb4_login: %s.%s@%s", ad.pname, ad.pinst, ad.prealm ); - bcopy( ad.session, seskey, sizeof( C_Block )); + memcpy( seskey, ad.session, sizeof( C_Block )); key_sched( seskey, seskeysched ); username = ad.pname; @@ -444,46 +461,46 @@ len = strlen( realm ); *p++ = len + 1; *p++ = '@'; - strcpy( p, realm ); + (void)strlcpy( p, realm, sizeof(p) ); p += len + 1; *rbuflen = p - rbuf; return( AFPERR_AUTHCONT ); case KRB4WRT_TOKEN : - bcopy( p, &len, sizeof( short )); + memcpy( &len, p, sizeof( len )); len = ntohs( len ); - p += sizeof( short ); - bcopy( p, &cr, len ); + p += sizeof( len ); + memcpy( &cr, p, len ); pcbc_encrypt((C_Block *)&cr, (C_Block *)&cr, len, seskeysched, seskey, DECRYPT ); p = buf; cr.ticket_st.length = ntohl( cr.ticket_st.length ); - bcopy( &cr.ticket_st.length, p, sizeof( int )); - p += sizeof( int ); - bcopy( cr.ticket_st.dat, p, cr.ticket_st.length ); + memcpy( p, &cr.ticket_st.length, sizeof( p )); + p += sizeof( p ); + memcpy( p, cr.ticket_st.dat, cr.ticket_st.length ); p += cr.ticket_st.length; ct.AuthHandle = ntohl( cr.kvno ); - bcopy( cr.session, ct.HandShakeKey, sizeof( cr.session )); + memcpy( ct.HandShakeKey, cr.session, sizeof( cr.session )); ct.ViceId = 0; ct.BeginTimestamp = ntohl( cr.issue_date ); ct.EndTimestamp = krb_life_to_time( ntohl( cr.issue_date ), ntohl( cr.lifetime )); aint = sizeof( struct ClearToken ); - bcopy( &aint, p, sizeof( int )); - p += sizeof( int ); - bcopy( &ct, p, sizeof( struct ClearToken )); + memcpy( p, &aint, sizeof( p )); + p += sizeof( p ); + memcpy( p, &ct, sizeof( struct ClearToken )); p += sizeof( struct ClearToken ); aint = 0; - bcopy( &aint, p, sizeof( int )); - p += sizeof( int ); + memcpy( p, &aint, sizeof( p )); + p += sizeof( p ); lcase( realm ); - strcpy( p, realm ); + (void)strlcpy( p, realm, sizeof(p) ); p += strlen( realm ) + 1; vi.in = buf; @@ -522,6 +539,7 @@ static char clrtxtname[ 32 ]; +int clrtxt_login( ibuf, ibuflen, rbuf, rbuflen ) char *ibuf, *rbuf; int ibuflen, *rbuflen; @@ -539,7 +557,7 @@ if ( len > 31 ) { return( AFPERR_PARAM ); } - bcopy( ibuf, clrtxtname, len ); + memcpy( clrtxtname, ibuf, len ); ibuf += len; clrtxtname[ len ] = '\0'; while ( len-- ) { @@ -594,13 +612,13 @@ CREDENTIALS cr; char *p, *q; int len, rc, whoserealm; - short slen; + int16_t slen; len = *ibuf++; ibuf[ len ] = '\0'; - if (( p = index( ibuf, '@' )) != NULL ) { + if (( p = strchr( ibuf, '@' )) != NULL ) { *p++ = '\0'; - strcpy( realm, p ); + (void)strlcpy( realm, p, sizeof(realm) ); ucase( realm ); whoserealm = 0; } else { @@ -610,13 +628,13 @@ } whoserealm = 1; } - if (( p = index( ibuf, '.' )) != NULL ) { + if (( p = strchr( ibuf, '.' )) != NULL ) { *p++ = '\0'; - strcpy( instance, p ); + (void)strlcpy( instance, p, sizeof(instance) ); } else { *instance = '\0'; } - strcpy( name, ibuf ); + (void)strlcpy( name, ibuf, sizeof(name) ); /* * We don't have the session key, yet. Get one. */ @@ -649,12 +667,12 @@ return( AFPERR_BADUAM ); } - bcopy( cr.session, seskey, sizeof( C_Block )); + memcpy( seskey, cr.session, sizeof( C_Block )); key_sched( seskey, seskeysched ); validseskey = 1; username = name; - bcopy( authent.dat, p, authent.length ); + memcpy( p, authent.dat, authent.length ); p += authent.length; } @@ -677,13 +695,13 @@ q += 10; len = strlen( realm ); - strcpy( p, realm ); + (void)strlcpy( p, realm, sizeof(p) ); p += len + 1; - bcopy( q, &slen, sizeof( short )); - bcopy( &slen, p, sizeof( short )); - p += sizeof( short ); - q += sizeof( short ); - bcopy( q, p, slen ); + memcpy( &slen, q, sizeof( slen )); + memcpy( p, &slen, sizeof( p )); + p += sizeof( p ); + q += sizeof( q ); + memcpy( p, q, slen ); p += slen; *rbuflen = p - rbuf; @@ -700,13 +718,13 @@ struct passwd *pwd; char buf[ 1024 ], *p; int aint; - short clen; + int16_t clen; *rbuflen = 0; ibuf += 2; - bcopy( ibuf, &clen, sizeof( short )); + memcpy( &clen, ibuf, sizeof( clen )); clen = ntohs( clen ); - ibuf += sizeof( short ); + ibuf += sizeof( clen ); pcbc_encrypt((C_Block *)ibuf, (C_Block *)ibuf, clen, seskeysched, seskey, DECRYPT ); @@ -723,30 +741,30 @@ } p = buf; - bcopy( &cr.ticket_st.length, p, sizeof( int )); - p += sizeof( int ); - bcopy( cr.ticket_st.dat, p, cr.ticket_st.length ); + memcpy( p, &cr.ticket_st.length, sizeof( p )); + p += sizeof( p ); + memcpy( p, cr.ticket_st.dat, cr.ticket_st.length ); p += cr.ticket_st.length; ct.AuthHandle = cr.kvno; - bcopy( cr.session, ct.HandShakeKey, sizeof( cr.session )); + memcpy( ct.HandShakeKey, cr.session, sizeof( cr.session )); ct.ViceId = 0; ct.BeginTimestamp = cr.issue_date; /* ct.EndTimestamp = cr.issue_date + ( cr.lifetime * 5 * 60 ); */ ct.EndTimestamp = krb_life_to_time( cr.issue_date, cr.lifetime ); aint = sizeof( struct ClearToken ); - bcopy( &aint, p, sizeof( int )); - p += sizeof( int ); - bcopy( &ct, p, sizeof( struct ClearToken )); + memcpy( p, &aint, sizeof( p )); + p += sizeof( p ); + memcpy( p, &ct, sizeof( struct ClearToken )); p += sizeof( struct ClearToken ); aint = 0; - bcopy( &aint, p, sizeof( int )); - p += sizeof( int ); + memcpy( p, &aint, sizeof( p )); + p += sizeof( p ); lcase( realm ); - strcpy( p, realm ); + (void)strlcpy( p, realm, sizeof(p) ); p += strlen( realm ) + 1; vi.in = buf;