@@ -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
177178new_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 }
10111016err:
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