Mercurial > hg > openjdk > jdk6 > jdk
changeset 1760:fce9d3983439
8186212: Improve GSS handling
Reviewed-by: weijun, ahgross
author | igerasim |
---|---|
date | Fri, 25 Aug 2017 20:57:09 -0700 |
parents | 478885d1d686 |
children | a63aa5418847 |
files | src/share/native/sun/security/jgss/wrapper/GSSLibStub.c |
diffstat | 1 files changed, 23 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c Thu Oct 19 17:04:03 2017 +0100 +++ b/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c Fri Aug 25 20:57:09 2017 -0700 @@ -769,7 +769,7 @@ { OM_uint32 minor, major; gss_cred_id_t credHdl ; - gss_ctx_id_t contextHdl; + gss_ctx_id_t contextHdl, contextHdlSave; gss_name_t targetName; gss_OID mech; OM_uint32 flags, aFlags; @@ -785,7 +785,7 @@ debug(env, "[GSSLibStub_initContext]"); credHdl = (gss_cred_id_t) pCred; - contextHdl = (gss_ctx_id_t) + contextHdl = contextHdlSave= (gss_ctx_id_t) (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext); targetName = (gss_name_t) pName; mech = (gss_OID) (*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech); @@ -818,10 +818,18 @@ (long)outToken.length); debug(env, debugBuf); + // update context handle with the latest value if changed + // this is to work with both MIT and Solaris. Former deletes half-built + // context if error occurs + if (contextHdl != contextHdlSave) { + (*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext, + (jlong) contextHdl); + sprintf(debugBuf, "[GSSLibStub_initContext] set pContext=%ld", (long)contextHdl); + debug(env, debugBuf); + } + if (GSS_ERROR(major) == GSS_S_COMPLETE) { /* update member values if needed */ - (*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext, - (jlong) contextHdl); (*env)->SetIntField(env, jcontextSpi, FID_NativeGSSContext_flags, aFlags); sprintf(debugBuf, "[GSSLibStub_initContext] set flags=0x%x", aFlags); debug(env, debugBuf); @@ -869,7 +877,7 @@ { OM_uint32 minor, major; OM_uint32 minor2, major2; - gss_ctx_id_t contextHdl; + gss_ctx_id_t contextHdl, contextHdlSave; gss_cred_id_t credHdl; gss_buffer_desc inToken; gss_channel_bindings_t cb; @@ -889,7 +897,7 @@ debug(env, "[GSSLibStub_acceptContext]"); - contextHdl = (gss_ctx_id_t) + contextHdl = contextHdlSave = (gss_ctx_id_t) (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext); credHdl = (gss_cred_id_t) pCred; initGSSBuffer(env, jinToken, &inToken); @@ -919,13 +927,19 @@ (long)credHdl, (long)contextHdl, (long) delCred); debug(env, debugBuf); - if (GSS_ERROR(major) == GSS_S_COMPLETE) { - /* update member values if needed */ + // update context handle with the latest value if changed + // this is to work with both MIT and Solaris. Former deletes half-built + // context if error occurs + if (contextHdl != contextHdlSave) { (*env)->SetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext, - (jlong) contextHdl); + (jlong) contextHdl); sprintf(debugBuf, "[GSSLibStub_acceptContext] set pContext=%ld", (long)contextHdl); debug(env, debugBuf); + } + + if (GSS_ERROR(major) == GSS_S_COMPLETE) { + /* update member values if needed */ // WORKAROUND for a Heimdal bug if (delCred == GSS_C_NO_CREDENTIAL) { aFlags &= 0xfffffffe;