changeset 57692:9bd776693ccf

8231134: Improved credential support Reviewed-by: ahgross, valeriep
author weijun
date Thu, 26 Sep 2019 18:13:20 +0800
parents 7250627144a6
children 553cb2204361
files src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp
diffstat 1 files changed, 79 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp	Thu Sep 26 18:12:53 2019 +0800
+++ b/src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp	Thu Sep 26 18:13:20 2019 +0800
@@ -132,8 +132,9 @@
         return 0;
     }
     ULONGLONG diff = (time->QuadPart - uiLocal.QuadPart) / 10000000;
-    if (diff > (ULONGLONG)~(OM_uint32)0)
+    if (diff > (ULONGLONG)~(OM_uint32)0) {
         return GSS_C_INDEFINITE;
+    }
     return (OM_uint32)diff;
 }
 
@@ -177,8 +178,10 @@
 new_cred()
 {
     gss_cred_id_t out = new gss_cred_id_struct;
-    out->phCredK = out->phCredS = NULL;
-    out->time = 0L;
+    if (out) {
+        out->phCredK = out->phCredS = NULL;
+        out->time = 0L;
+    }
     return out;
 }
 
@@ -864,6 +867,7 @@
     SecBufferDesc outBuffDesc;
     SecBuffer outSecBuff;
     BOOLEAN isSPNEGO = is_same_oid(mech_type, &SPNEGO_OID);
+    CredHandle* newCred = NULL;
 
     gss_ctx_id_t pc;
 
@@ -928,7 +932,10 @@
             pc->isLocalCred = FALSE;
         } else {
             PP("No credentials provided, acquire myself");
-            CredHandle* newCred = new CredHandle;
+            newCred = new CredHandle;
+            if (!newCred) {
+                goto err;
+            }
             SEC_WINNT_AUTH_IDENTITY_EX auth;
             ZeroMemory(&auth, sizeof(auth));
             auth.Version = SEC_WINNT_AUTH_IDENTITY_VERSION;
@@ -947,7 +954,6 @@
                     newCred,
                     &lifeTime);
             if (!(SEC_SUCCESS(ss))) {
-                delete newCred;
                 goto err;
             }
             pc->phCred = newCred;
@@ -989,7 +995,6 @@
         output_token->value = new char[outSecBuff.cbBuffer];
         if (!output_token->value) {
             FreeContextBuffer(outSecBuff.pvBuffer);
-            output_token->length = 0;
             goto err;
         }
         memcpy(output_token->value, outSecBuff.pvBuffer, outSecBuff.cbBuffer);
@@ -1009,14 +1014,17 @@
         return GSS_S_COMPLETE;
     }
 err:
+    if (newCred) {
+        delete newCred;
+    }
     if (firstTime) {
         OM_uint32 dummy;
         gss_delete_sec_context(&dummy, context_handle, GSS_C_NO_BUFFER);
     }
     if (output_token->value) {
         gss_release_buffer(NULL, output_token);
-        output_token = GSS_C_NO_BUFFER;
     }
+    output_token = GSS_C_NO_BUFFER;
     return GSS_S_FAILURE;
 }
 
@@ -1233,17 +1241,26 @@
     secBuff[1].cbBuffer = context_handle->SecPkgContextSizes.cbMaxSignature;
     secBuff[1].pvBuffer = msg_token->value = new char[secBuff[1].cbBuffer];
 
+    if (!secBuff[1].pvBuffer) {
+        goto err;
+    }
+
     ss = MakeSignature((PCtxtHandle)&context_handle->hCtxt, 0, &buffDesc, 0);
 
     if (!SEC_SUCCESS(ss)) {
-        msg_token->length = 0;
-        msg_token->value = NULL;
-        delete[] secBuff[1].pvBuffer;
-        return GSS_S_FAILURE;
+        goto err;
     }
 
     msg_token->length = secBuff[1].cbBuffer;
     return GSS_S_COMPLETE;
+
+err:
+    msg_token->length = 0;
+    msg_token->value = NULL;
+    if (secBuff[1].pvBuffer) {
+        delete[] secBuff[1].pvBuffer;
+    }
+    return GSS_S_FAILURE;
 }
 
 __declspec(dllexport) OM_uint32
@@ -1317,16 +1334,25 @@
             context_handle->SecPkgContextSizes.cbSecurityTrailer
                     + input_message_buffer->length
                     + context_handle->SecPkgContextSizes.cbBlockSize);;
+    if (!output_message_buffer->value) {
+        goto err;
+    }
 
     secBuff[1].BufferType = SECBUFFER_DATA;
     secBuff[1].cbBuffer = (ULONG)input_message_buffer->length;
     secBuff[1].pvBuffer = malloc(secBuff[1].cbBuffer);
+    if (!secBuff[1].pvBuffer) {
+        goto err;
+    }
     memcpy_s(secBuff[1].pvBuffer, secBuff[1].cbBuffer,
             input_message_buffer->value, input_message_buffer->length);
 
     secBuff[2].BufferType = SECBUFFER_PADDING;
     secBuff[2].cbBuffer = context_handle->SecPkgContextSizes.cbBlockSize;
     secBuff[2].pvBuffer = malloc(secBuff[2].cbBuffer);
+    if (!secBuff[2].pvBuffer) {
+        goto err;
+    }
 
     ss = EncryptMessage((PCtxtHandle)&context_handle->hCtxt,
             conf_req_flag ? 0 : SECQOP_WRAP_NO_ENCRYPT,
@@ -1336,12 +1362,7 @@
     }
 
     if (!SEC_SUCCESS(ss)) {
-        free(secBuff[0].pvBuffer);
-        free(secBuff[1].pvBuffer);
-        free(secBuff[2].pvBuffer);
-        output_message_buffer->length = 0;
-        output_message_buffer->value = NULL;
-        return GSS_S_FAILURE;
+        goto err;
     }
 
     memcpy_s((PBYTE)secBuff[0].pvBuffer + secBuff[0].cbBuffer,
@@ -1359,6 +1380,20 @@
     free(secBuff[2].pvBuffer);
 
     return GSS_S_COMPLETE;
+
+err:
+    if (secBuff[0].pvBuffer) {
+        free(secBuff[0].pvBuffer);
+    }
+    if (secBuff[1].pvBuffer) {
+        free(secBuff[1].pvBuffer);
+    }
+    if (secBuff[2].pvBuffer) {
+        free(secBuff[2].pvBuffer);
+    }
+    output_message_buffer->length = 0;
+    output_message_buffer->value = NULL;
+    return GSS_S_FAILURE;
 }
 
 __declspec(dllexport) OM_uint32
@@ -1386,6 +1421,11 @@
     secBuff[0].BufferType = SECBUFFER_STREAM;
     secBuff[0].cbBuffer = (ULONG)input_message_buffer->length;
     secBuff[0].pvBuffer = malloc(input_message_buffer->length);
+
+    if (!secBuff[0].pvBuffer) {
+        goto err;
+    }
+
     memcpy_s(secBuff[0].pvBuffer, input_message_buffer->length,
             input_message_buffer->value, input_message_buffer->length);
 
@@ -1398,21 +1438,31 @@
         *qop_state = ulQop;
     }
     if (!SEC_SUCCESS(ss)) {
-        free(secBuff[0].pvBuffer);
-        output_message_buffer->length = 0;
-        output_message_buffer->value = NULL;
-        return GSS_S_FAILURE;
+        goto err;
     }
 
     // Must allocate a new memory block so client can release it correctly
     output_message_buffer->length = secBuff[1].cbBuffer;
     output_message_buffer->value = new char[secBuff[1].cbBuffer];
+
+    if (!output_message_buffer->value) {
+        goto err;
+    }
+
     memcpy_s(output_message_buffer->value, secBuff[1].cbBuffer,
             secBuff[1].pvBuffer, secBuff[1].cbBuffer);
     *conf_state = ulQop == SECQOP_WRAP_NO_ENCRYPT ? 0 : 1;
 
     free(secBuff[0].pvBuffer);
     return GSS_S_COMPLETE;
+
+err:
+    if (secBuff[0].pvBuffer) {
+        free(secBuff[0].pvBuffer);
+    }
+    output_message_buffer->length = 0;
+    output_message_buffer->value = NULL;
+    return GSS_S_FAILURE;
 }
 
 __declspec(dllexport) OM_uint32
@@ -1544,11 +1594,19 @@
             msg, 256, 0);
     if (len > 0) {
         status_string->value = new char[len + 20];
+        if (!status_string->value) {
+            status_string = GSS_C_NO_BUFFER;
+            return GSS_S_FAILURE;
+        }
         status_string->length = sprintf_s(
                 (LPSTR)status_string->value, len + 19,
                 "(%lx) %ls", status_value, msg);
     } else {
         status_string->value = new char[33];
+        if (!status_string->value) {
+            status_string = GSS_C_NO_BUFFER;
+            return GSS_S_FAILURE;
+        }
         status_string->length = sprintf_s(
                 (LPSTR)status_string->value, 32,
                 "status is %lx", status_value);