Don't overwrite the minor status from accept_sec_context()
[mod_auth_kerb.git] / spnegokrb5 / accept_sec_context.c
index 9f76695..3f713ee 100644 (file)
@@ -64,8 +64,18 @@ code_NegTokenArg(OM_uint32 *minor_status,
        }
     } while (ret == ASN1_OVERFLOW);
 
-    *outbuf      = buf + buf_size - buf_len;
+    *outbuf = malloc(buf_len);
+    if (*outbuf == NULL) {
+       *minor_status = ENOMEM;
+       free(buf);
+       return GSS_S_FAILURE;
+    }
+
+    memcpy(*outbuf, buf + buf_size - buf_len, buf_len);
     *outbuf_size = buf_len;
+
+    free(buf);
+    
     return GSS_S_COMPLETE;
 }
 
@@ -145,7 +155,7 @@ send_accept (OM_uint32 *minor_status,
     }
 
     ret = code_NegTokenArg (minor_status, &targ, 
-                           (unsigned char**) &output_token->value, &output_token->length);
+                           (unsigned char **) &output_token->value, &output_token->length);
     free_NegTokenTarg(&targ);
     if (ret)
        return ret;
@@ -168,9 +178,9 @@ OM_uint32 gss_accept_sec_context_spnego
 {
    NegTokenInit init_token;
    OM_uint32 major_status;
+   OM_uint32 minor_status2;
    gss_buffer_desc ibuf, obuf;
    gss_buffer_t ot = NULL;
-   OM_uint32 minor;
    unsigned char *buf;
    size_t buf_size;
    size_t len, taglen, ni_len;
@@ -222,7 +232,7 @@ OM_uint32 gss_accept_sec_context_spnego
       ibuf.length = init_token.mechToken->length;
       ibuf.value  = init_token.mechToken->data;
 
-      major_status = gss_accept_sec_context(&minor,
+      major_status = gss_accept_sec_context(minor_status,
                                            context_handle,
                                            acceptor_cred_handle,
                                            &ibuf,
@@ -234,15 +244,15 @@ OM_uint32 gss_accept_sec_context_spnego
                                            time_rec,
                                            delegated_cred_handle);
       if (GSS_ERROR(major_status)) {
-        send_reject (minor_status, output_token);
+        send_reject (&minor_status2, output_token);
         return major_status;
       }
       ot = &obuf;
    }
 
-   ret = send_accept (minor_status, output_token, ot);
+   ret = send_accept (&minor_status2, output_token, ot);
    if (ot != NULL)
-      gss_release_buffer(&minor, ot);
+      gss_release_buffer(&minor_status2, ot);
 
    return ret;
 }