if (code = krb5_c_decrypt(context, ctx->subkey,
KRB5_KEYUSAGE_GSS_TOK_WRAP_PRIV,
0, &cipher, &plain)) {
+ free(plain.data);
*minor_status = code;
return(GSS_S_FAILURE);
}
bodysize = plain.length;
if (bodysize < 7) {
+ free(plain.data);
*minor_status = G_TOK_TRUNC;
return(GSS_S_DEFECTIVE_TOKEN);
}
ptr += 2;
bodysize -= 7;
- if (bodysize != tmsglen) {
- *minor_status = G_TOK_TRUNC;
- return(GSS_S_DEFECTIVE_TOKEN);
+ /* check context expiry */
+
+ if ((code = krb5_timeofday(context, &now))) {
+ free(plain.data);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
}
- tmsg = ptr;
+ if (now > ctx->endtime) {
+ free(plain.data);
+ *minor_status = 0;
+ return(GSS_S_CONTEXT_EXPIRED);
+ }
- /* check context expiry */
+ /* do sequencing checks */
- if ((code = krb5_timeofday(context, &now))) {
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
+ if ((ctx->initiate && tdirection != 0xff) ||
+ (!ctx->initiate && tdirection != 0)) {
+ free(plain.data);
+ *minor_status = G_BAD_DIRECTION;
+ return(GSS_S_BAD_SIG);
+ }
- if (now > ctx->endtime) {
- *minor_status = 0;
- return(GSS_S_CONTEXT_EXPIRED);
- }
+ if (retval = g_order_check(&(ctx->seqstate), tseqnum)) {
+ free(plain.data);
+ *minor_status = 0;
+ return(retval);
+ }
- /* do sequencing checks */
+ /* now copy out the data. can't do a strict equality check here,
+ since the output could be padded. */
- if ((ctx->initiate && tdirection != 0xff) ||
- (!ctx->initiate && tdirection != 0)) {
- *minor_status = G_BAD_DIRECTION;
- return(GSS_S_BAD_SIG);
- }
+ if (bodysize < tmsglen) {
+ free(plain.data);
+ *minor_status = G_TOK_TRUNC;
+ return(GSS_S_DEFECTIVE_TOKEN);
+ }
- if (retval = g_order_check(&(ctx->seqstate), tseqnum)) {
- *minor_status = 0;
- return(retval);
- }
+ tmsg = ptr;
- if ((output->value = (void *) malloc(tmsglen)) == NULL) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
+ if ((output->value = (void *) malloc(tmsglen)) == NULL) {
+ free(plain.data);
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
- memcpy(output->value, tmsg, tmsglen);
- output->length = tmsglen;
+ memcpy(output->value, tmsg, tmsglen);
+ output->length = tmsglen;
- if (qop_state)
- *qop_state = GSS_C_QOP_DEFAULT;
+ if (qop_state)
+ *qop_state = GSS_C_QOP_DEFAULT;
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ free(plain.data);
+
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
/* message_buffer is an input if SIGN, output if SEAL, and ignored if DEL_CTX