diff options
Diffstat (limited to 'lib/krb5/rd_priv.c')
| -rw-r--r-- | lib/krb5/rd_priv.c | 99 | 
1 files changed, 49 insertions, 50 deletions
| diff --git a/lib/krb5/rd_priv.c b/lib/krb5/rd_priv.c index ed7a2ccc5278..8a46195b694f 100644 --- a/lib/krb5/rd_priv.c +++ b/lib/krb5/rd_priv.c @@ -1,41 +1,39 @@  /* - * Copyright (c) 1997-2007 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden).  - * All rights reserved.  + * Copyright (c) 1997-2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved.   * - * Redistribution and use in source and binary forms, with or without  - * modification, are permitted provided that the following conditions  - * are met:  + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met:   * - * 1. Redistributions of source code must retain the above copyright  - *    notice, this list of conditions and the following disclaimer.  + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer.   * - * 2. Redistributions in binary form must reproduce the above copyright  - *    notice, this list of conditions and the following disclaimer in the  - *    documentation and/or other materials provided with the distribution.  + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution.   * - * 3. Neither the name of the Institute nor the names of its contributors  - *    may be used to endorse or promote products derived from this software  - *    without specific prior written permission.  + * 3. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission.   * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  - * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  - * SUCH DAMAGE.  + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE.   */ -#include <krb5_locl.h> +#include "krb5_locl.h" -RCSID("$Id: rd_priv.c 21751 2007-07-31 20:42:20Z lha $"); - -krb5_error_code KRB5_LIB_FUNCTION +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL  krb5_rd_priv(krb5_context context,  	     krb5_auth_context auth_context,  	     const krb5_data *inbuf, @@ -50,29 +48,33 @@ krb5_rd_priv(krb5_context context,      krb5_keyblock *key;      krb5_crypto crypto; -    if (outbuf) -	krb5_data_zero(outbuf); +    krb5_data_zero(outbuf); -    if ((auth_context->flags &  -	 (KRB5_AUTH_CONTEXT_RET_TIME | KRB5_AUTH_CONTEXT_RET_SEQUENCE)) && -	outdata == NULL) { -	krb5_clear_error_string (context); -	return KRB5_RC_REQUIRED; /* XXX better error, MIT returns this */ +    if ((auth_context->flags & +	 (KRB5_AUTH_CONTEXT_RET_TIME | KRB5_AUTH_CONTEXT_RET_SEQUENCE))) +    { +	if (outdata == NULL) { +	    krb5_clear_error_message (context); +	    return KRB5_RC_REQUIRED; /* XXX better error, MIT returns this */ +	} +	/* if these fields are not present in the priv-part, silently +           return zero */ +	memset(outdata, 0, sizeof(*outdata));      }      memset(&priv, 0, sizeof(priv));      ret = decode_KRB_PRIV (inbuf->data, inbuf->length, &priv, &len);      if (ret) { -	krb5_clear_error_string (context); +	krb5_clear_error_message (context);  	goto failure;      }      if (priv.pvno != 5) { -	krb5_clear_error_string (context); +	krb5_clear_error_message (context);  	ret = KRB5KRB_AP_ERR_BADVERSION;  	goto failure;      }      if (priv.msg_type != krb_priv) { -	krb5_clear_error_string (context); +	krb5_clear_error_message (context);  	ret = KRB5KRB_AP_ERR_MSG_TYPE;  	goto failure;      } @@ -93,16 +95,16 @@ krb5_rd_priv(krb5_context context,  				     &priv.enc_part,  				     &plain);      krb5_crypto_destroy(context, crypto); -    if (ret)  +    if (ret)  	goto failure;      ret = decode_EncKrbPrivPart (plain.data, plain.length, &part, &len);      krb5_data_free (&plain);      if (ret) { -	krb5_clear_error_string (context); +	krb5_clear_error_message (context);  	goto failure;      } -   +      /* check sender address */      if (part.s_address @@ -110,7 +112,7 @@ krb5_rd_priv(krb5_context context,  	&& !krb5_address_compare (context,  				  auth_context->remote_address,  				  part.s_address)) { -	krb5_clear_error_string (context); +	krb5_clear_error_message (context);  	ret = KRB5KRB_AP_ERR_BADADDR;  	goto failure_part;      } @@ -122,7 +124,7 @@ krb5_rd_priv(krb5_context context,  	&& !krb5_address_compare (context,  				  auth_context->local_address,  				  part.r_address)) { -	krb5_clear_error_string (context); +	krb5_clear_error_message (context);  	ret = KRB5KRB_AP_ERR_BADADDR;  	goto failure_part;      } @@ -135,7 +137,7 @@ krb5_rd_priv(krb5_context context,  	if (part.timestamp == NULL ||  	    part.usec      == NULL ||  	    abs(*part.timestamp - sec) > context->max_skew) { -	    krb5_clear_error_string (context); +	    krb5_clear_error_message (context);  	    ret = KRB5KRB_AP_ERR_SKEW;  	    goto failure_part;  	} @@ -152,7 +154,7 @@ krb5_rd_priv(krb5_context context,  	     && auth_context->remote_seqnumber != 0)  	    || (part.seq_number != NULL  		&& *part.seq_number != auth_context->remote_seqnumber)) { -	    krb5_clear_error_string (context); +	    krb5_clear_error_message (context);  	    ret = KRB5KRB_AP_ERR_BADORDER;  	    goto failure_part;  	} @@ -163,11 +165,8 @@ krb5_rd_priv(krb5_context context,      if (ret)  	goto failure_part; -    if ((auth_context->flags &  +    if ((auth_context->flags &  	 (KRB5_AUTH_CONTEXT_RET_TIME | KRB5_AUTH_CONTEXT_RET_SEQUENCE))) { -	/* if these fields are not present in the priv-part, silently -           return zero */ -	memset(outdata, 0, sizeof(*outdata));  	if(part.timestamp)  	    outdata->timestamp = *part.timestamp;  	if(part.usec) | 
