TODO all s4:auth/gensec_gssapi: add NT_STATUS_NO_MEMORY checks
authorStefan Metzmacher <metze@samba.org>
Fri, 2 Mar 2012 21:00:59 +0000 (22:00 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 16 Jan 2018 06:43:46 +0000 (07:43 +0100)
metze

source4/auth/gensec/gensec_gssapi.c

index a61b2b2659cbd4001e2acfd4afdccf4999d15fa3..506af56170d5df91ca5ca1dc1f75980f113efb21 100644 (file)
@@ -451,6 +451,8 @@ static NTSTATUS gensec_gssapi_update_internal(struct gensec_security *gensec_sec
        input_token.length = in.length;
        input_token.value = in.data;
 
+       *out = data_blob_null;
+
        switch (gensec_gssapi_state->sasl_state) {
        case STAGE_GSS_NEG:
        {
@@ -660,9 +662,16 @@ init_sec_context_done:
                gensec_gssapi_state->gss_exchange_count++;
 
                if (maj_stat == GSS_S_COMPLETE) {
-                       *out = data_blob_talloc(out_mem_ctx, output_token.value, output_token.length);
-                       gss_release_buffer(&min_stat2, &output_token);
-                       
+                       if (output_token.length) {
+                               *out = data_blob_talloc(out_mem_ctx,
+                                                       output_token.value,
+                                                       output_token.length);
+                               gss_release_buffer(&min_stat2, &output_token);
+                               if (out->data == NULL) {
+                                       return NT_STATUS_NO_MEMORY;
+                               }
+                       }
+
                        if (gensec_gssapi_state->gss_got_flags & GSS_C_DELEG_FLAG &&
                            gensec_gssapi_state->delegated_cred_handle != GSS_C_NO_CREDENTIAL) {
                                DEBUG(5, ("gensec_gssapi: credentials were delegated\n"));
@@ -692,9 +701,16 @@ init_sec_context_done:
                                return NT_STATUS_OK;
                        }
                } else if (maj_stat == GSS_S_CONTINUE_NEEDED) {
-                       *out = data_blob_talloc(out_mem_ctx, output_token.value, output_token.length);
-                       gss_release_buffer(&min_stat2, &output_token);
-                       
+                       if (output_token.length) {
+                               *out = data_blob_talloc(out_mem_ctx,
+                                                       output_token.value,
+                                                       output_token.length);
+                               gss_release_buffer(&min_stat2, &output_token);
+                               if (out->data == NULL) {
+                                       return NT_STATUS_NO_MEMORY;
+                               }
+                       }
+
                        return NT_STATUS_MORE_PROCESSING_REQUIRED;
                } else if (maj_stat == GSS_S_CONTEXT_EXPIRED) {
                        gss_cred_id_t creds = NULL;