Skip to content

Commit 7c32a6a

Browse files
committed
8231134: Improved credential support
Reviewed-by: ahgross, valeriep
1 parent bda0fba commit 7c32a6a

1 file changed

Lines changed: 79 additions & 21 deletions

File tree

  • src/java.security.jgss/windows/native/libsspi_bridge

src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp

Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,9 @@ seconds_until(int inputIsUTC, TimeStamp *time)
132132
return 0;
133133
}
134134
ULONGLONG diff = (time->QuadPart - uiLocal.QuadPart) / 10000000;
135-
if (diff > (ULONGLONG)~(OM_uint32)0)
135+
if (diff > (ULONGLONG)~(OM_uint32)0) {
136136
return GSS_C_INDEFINITE;
137+
}
137138
return (OM_uint32)diff;
138139
}
139140

@@ -177,8 +178,10 @@ static gss_cred_id_t
177178
new_cred()
178179
{
179180
gss_cred_id_t out = new gss_cred_id_struct;
180-
out->phCredK = out->phCredS = NULL;
181-
out->time = 0L;
181+
if (out) {
182+
out->phCredK = out->phCredS = NULL;
183+
out->time = 0L;
184+
}
182185
return out;
183186
}
184187

@@ -864,6 +867,7 @@ gss_init_sec_context(OM_uint32 *minor_status,
864867
SecBufferDesc outBuffDesc;
865868
SecBuffer outSecBuff;
866869
BOOLEAN isSPNEGO = is_same_oid(mech_type, &SPNEGO_OID);
870+
CredHandle* newCred = NULL;
867871

868872
gss_ctx_id_t pc;
869873

@@ -928,7 +932,10 @@ gss_init_sec_context(OM_uint32 *minor_status,
928932
pc->isLocalCred = FALSE;
929933
} else {
930934
PP("No credentials provided, acquire myself");
931-
CredHandle* newCred = new CredHandle;
935+
newCred = new CredHandle;
936+
if (!newCred) {
937+
goto err;
938+
}
932939
SEC_WINNT_AUTH_IDENTITY_EX auth;
933940
ZeroMemory(&auth, sizeof(auth));
934941
auth.Version = SEC_WINNT_AUTH_IDENTITY_VERSION;
@@ -947,7 +954,6 @@ gss_init_sec_context(OM_uint32 *minor_status,
947954
newCred,
948955
&lifeTime);
949956
if (!(SEC_SUCCESS(ss))) {
950-
delete newCred;
951957
goto err;
952958
}
953959
pc->phCred = newCred;
@@ -989,7 +995,6 @@ gss_init_sec_context(OM_uint32 *minor_status,
989995
output_token->value = new char[outSecBuff.cbBuffer];
990996
if (!output_token->value) {
991997
FreeContextBuffer(outSecBuff.pvBuffer);
992-
output_token->length = 0;
993998
goto err;
994999
}
9951000
memcpy(output_token->value, outSecBuff.pvBuffer, outSecBuff.cbBuffer);
@@ -1009,14 +1014,17 @@ gss_init_sec_context(OM_uint32 *minor_status,
10091014
return GSS_S_COMPLETE;
10101015
}
10111016
err:
1017+
if (newCred) {
1018+
delete newCred;
1019+
}
10121020
if (firstTime) {
10131021
OM_uint32 dummy;
10141022
gss_delete_sec_context(&dummy, context_handle, GSS_C_NO_BUFFER);
10151023
}
10161024
if (output_token->value) {
10171025
gss_release_buffer(NULL, output_token);
1018-
output_token = GSS_C_NO_BUFFER;
10191026
}
1027+
output_token = GSS_C_NO_BUFFER;
10201028
return GSS_S_FAILURE;
10211029
}
10221030

@@ -1233,17 +1241,26 @@ gss_get_mic(OM_uint32 *minor_status,
12331241
secBuff[1].cbBuffer = context_handle->SecPkgContextSizes.cbMaxSignature;
12341242
secBuff[1].pvBuffer = msg_token->value = new char[secBuff[1].cbBuffer];
12351243

1244+
if (!secBuff[1].pvBuffer) {
1245+
goto err;
1246+
}
1247+
12361248
ss = MakeSignature((PCtxtHandle)&context_handle->hCtxt, 0, &buffDesc, 0);
12371249

12381250
if (!SEC_SUCCESS(ss)) {
1239-
msg_token->length = 0;
1240-
msg_token->value = NULL;
1241-
delete[] secBuff[1].pvBuffer;
1242-
return GSS_S_FAILURE;
1251+
goto err;
12431252
}
12441253

12451254
msg_token->length = secBuff[1].cbBuffer;
12461255
return GSS_S_COMPLETE;
1256+
1257+
err:
1258+
msg_token->length = 0;
1259+
msg_token->value = NULL;
1260+
if (secBuff[1].pvBuffer) {
1261+
delete[] secBuff[1].pvBuffer;
1262+
}
1263+
return GSS_S_FAILURE;
12471264
}
12481265

12491266
__declspec(dllexport) OM_uint32
@@ -1317,16 +1334,25 @@ gss_wrap(OM_uint32 *minor_status,
13171334
context_handle->SecPkgContextSizes.cbSecurityTrailer
13181335
+ input_message_buffer->length
13191336
+ context_handle->SecPkgContextSizes.cbBlockSize);;
1337+
if (!output_message_buffer->value) {
1338+
goto err;
1339+
}
13201340

13211341
secBuff[1].BufferType = SECBUFFER_DATA;
13221342
secBuff[1].cbBuffer = (ULONG)input_message_buffer->length;
13231343
secBuff[1].pvBuffer = malloc(secBuff[1].cbBuffer);
1344+
if (!secBuff[1].pvBuffer) {
1345+
goto err;
1346+
}
13241347
memcpy_s(secBuff[1].pvBuffer, secBuff[1].cbBuffer,
13251348
input_message_buffer->value, input_message_buffer->length);
13261349

13271350
secBuff[2].BufferType = SECBUFFER_PADDING;
13281351
secBuff[2].cbBuffer = context_handle->SecPkgContextSizes.cbBlockSize;
13291352
secBuff[2].pvBuffer = malloc(secBuff[2].cbBuffer);
1353+
if (!secBuff[2].pvBuffer) {
1354+
goto err;
1355+
}
13301356

13311357
ss = EncryptMessage((PCtxtHandle)&context_handle->hCtxt,
13321358
conf_req_flag ? 0 : SECQOP_WRAP_NO_ENCRYPT,
@@ -1336,12 +1362,7 @@ gss_wrap(OM_uint32 *minor_status,
13361362
}
13371363

13381364
if (!SEC_SUCCESS(ss)) {
1339-
free(secBuff[0].pvBuffer);
1340-
free(secBuff[1].pvBuffer);
1341-
free(secBuff[2].pvBuffer);
1342-
output_message_buffer->length = 0;
1343-
output_message_buffer->value = NULL;
1344-
return GSS_S_FAILURE;
1365+
goto err;
13451366
}
13461367

13471368
memcpy_s((PBYTE)secBuff[0].pvBuffer + secBuff[0].cbBuffer,
@@ -1359,6 +1380,20 @@ gss_wrap(OM_uint32 *minor_status,
13591380
free(secBuff[2].pvBuffer);
13601381

13611382
return GSS_S_COMPLETE;
1383+
1384+
err:
1385+
if (secBuff[0].pvBuffer) {
1386+
free(secBuff[0].pvBuffer);
1387+
}
1388+
if (secBuff[1].pvBuffer) {
1389+
free(secBuff[1].pvBuffer);
1390+
}
1391+
if (secBuff[2].pvBuffer) {
1392+
free(secBuff[2].pvBuffer);
1393+
}
1394+
output_message_buffer->length = 0;
1395+
output_message_buffer->value = NULL;
1396+
return GSS_S_FAILURE;
13621397
}
13631398

13641399
__declspec(dllexport) OM_uint32
@@ -1386,6 +1421,11 @@ gss_unwrap(OM_uint32 *minor_status,
13861421
secBuff[0].BufferType = SECBUFFER_STREAM;
13871422
secBuff[0].cbBuffer = (ULONG)input_message_buffer->length;
13881423
secBuff[0].pvBuffer = malloc(input_message_buffer->length);
1424+
1425+
if (!secBuff[0].pvBuffer) {
1426+
goto err;
1427+
}
1428+
13891429
memcpy_s(secBuff[0].pvBuffer, input_message_buffer->length,
13901430
input_message_buffer->value, input_message_buffer->length);
13911431

@@ -1398,21 +1438,31 @@ gss_unwrap(OM_uint32 *minor_status,
13981438
*qop_state = ulQop;
13991439
}
14001440
if (!SEC_SUCCESS(ss)) {
1401-
free(secBuff[0].pvBuffer);
1402-
output_message_buffer->length = 0;
1403-
output_message_buffer->value = NULL;
1404-
return GSS_S_FAILURE;
1441+
goto err;
14051442
}
14061443

14071444
// Must allocate a new memory block so client can release it correctly
14081445
output_message_buffer->length = secBuff[1].cbBuffer;
14091446
output_message_buffer->value = new char[secBuff[1].cbBuffer];
1447+
1448+
if (!output_message_buffer->value) {
1449+
goto err;
1450+
}
1451+
14101452
memcpy_s(output_message_buffer->value, secBuff[1].cbBuffer,
14111453
secBuff[1].pvBuffer, secBuff[1].cbBuffer);
14121454
*conf_state = ulQop == SECQOP_WRAP_NO_ENCRYPT ? 0 : 1;
14131455

14141456
free(secBuff[0].pvBuffer);
14151457
return GSS_S_COMPLETE;
1458+
1459+
err:
1460+
if (secBuff[0].pvBuffer) {
1461+
free(secBuff[0].pvBuffer);
1462+
}
1463+
output_message_buffer->length = 0;
1464+
output_message_buffer->value = NULL;
1465+
return GSS_S_FAILURE;
14161466
}
14171467

14181468
__declspec(dllexport) OM_uint32
@@ -1544,11 +1594,19 @@ gss_display_status(OM_uint32 *minor_status,
15441594
msg, 256, 0);
15451595
if (len > 0) {
15461596
status_string->value = new char[len + 20];
1597+
if (!status_string->value) {
1598+
status_string = GSS_C_NO_BUFFER;
1599+
return GSS_S_FAILURE;
1600+
}
15471601
status_string->length = sprintf_s(
15481602
(LPSTR)status_string->value, len + 19,
15491603
"(%lx) %ls", status_value, msg);
15501604
} else {
15511605
status_string->value = new char[33];
1606+
if (!status_string->value) {
1607+
status_string = GSS_C_NO_BUFFER;
1608+
return GSS_S_FAILURE;
1609+
}
15521610
status_string->length = sprintf_s(
15531611
(LPSTR)status_string->value, 32,
15541612
"status is %lx", status_value);

0 commit comments

Comments
 (0)