jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c
changeset 16488 816b9df68a9f
parent 14517 e50acb436a8d
child 18175 4ed91d93ab81
equal deleted inserted replaced
16487:f3fecb3d79af 16488:816b9df68a9f
    25 
    25 
    26 #include "sun_security_jgss_wrapper_GSSLibStub.h"
    26 #include "sun_security_jgss_wrapper_GSSLibStub.h"
    27 #include "NativeUtil.h"
    27 #include "NativeUtil.h"
    28 #include "NativeFunc.h"
    28 #include "NativeFunc.h"
    29 #include "jlong.h"
    29 #include "jlong.h"
    30 
    30 #include <jni.h>
    31 /* Constants for indicating what type of info is needed for inqueries */
    31 
       
    32 /* Throws a Java Exception by name */
       
    33 
       
    34 void throwByName(JNIEnv *env, const char *name, const char *msg) {
       
    35     jclass cls = (*env)->FindClass(env, name);
       
    36 
       
    37     if (cls != 0) /* Otherwise an exception has already been thrown */
       
    38         (*env)->ThrowNew(env, cls, msg);
       
    39 }
       
    40 
       
    41 void throwOutOfMemoryError(JNIEnv *env, const char *message) {
       
    42     throwByName(env, "java/lang/OutOfMemoryError", message);
       
    43 }
       
    44 
       
    45 /* Constants for indicating what type of info is needed for inquiries */
    32 const int TYPE_CRED_NAME = 10;
    46 const int TYPE_CRED_NAME = 10;
    33 const int TYPE_CRED_TIME = 11;
    47 const int TYPE_CRED_TIME = 11;
    34 const int TYPE_CRED_USAGE = 12;
    48 const int TYPE_CRED_USAGE = 12;
    35 
    49 
    36 /*
    50 /*
   115   jbyteArray value;
   129   jbyteArray value;
   116 
   130 
   117   if (jcb == NULL) {
   131   if (jcb == NULL) {
   118     return GSS_C_NO_CHANNEL_BINDINGS;
   132     return GSS_C_NO_CHANNEL_BINDINGS;
   119   }
   133   }
       
   134 
   120   cb = malloc(sizeof(struct gss_channel_bindings_struct));
   135   cb = malloc(sizeof(struct gss_channel_bindings_struct));
       
   136 
       
   137   if (cb == NULL) {
       
   138     throwOutOfMemoryError(env,NULL);
       
   139     return NULL;
       
   140   }
       
   141 
   121   /* set up initiator address */
   142   /* set up initiator address */
   122   jinetAddr =
   143   jinetAddr =
   123     (*env)->CallObjectMethod(env, jcb,
   144     (*env)->CallObjectMethod(env, jcb,
   124                              MID_ChannelBinding_getInitiatorAddr);
   145                              MID_ChannelBinding_getInitiatorAddr);
   125   if (jinetAddr != NULL) {
   146   if (jinetAddr != NULL) {
   299 {
   320 {
   300   OM_uint32 minor, major;
   321   OM_uint32 minor, major;
   301   gss_buffer_desc nameVal;
   322   gss_buffer_desc nameVal;
   302   gss_OID nameType;
   323   gss_OID nameType;
   303   gss_name_t nameHdl;
   324   gss_name_t nameHdl;
       
   325   nameHdl = GSS_C_NO_NAME;
   304 
   326 
   305   debug(env, "[GSSLibStub_importName]");
   327   debug(env, "[GSSLibStub_importName]");
   306 
   328 
   307   initGSSBuffer(env, jnameVal, &nameVal);
   329   initGSSBuffer(env, jnameVal, &nameVal);
   308   nameType = newGSSOID(env, jnameType);
   330   nameType = newGSSOID(env, jnameType);
   309   nameHdl = GSS_C_NO_NAME;
   331   if ((*env)->ExceptionCheck(env)) {
       
   332     return jlong_zero;
       
   333   }
   310 
   334 
   311   /* gss_import_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME,
   335   /* gss_import_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME,
   312      GSS_S_BAD_MECH */
   336      GSS_S_BAD_MECH */
   313   major = (*ftab->importName)(&minor, &nameVal, nameType, &nameHdl);
   337   major = (*ftab->importName)(&minor, &nameVal, nameType, &nameHdl);
   314 
   338 
   507   gss_OID mech;
   531   gss_OID mech;
   508   gss_OID_set mechs;
   532   gss_OID_set mechs;
   509   gss_cred_usage_t credUsage;
   533   gss_cred_usage_t credUsage;
   510   gss_name_t nameHdl;
   534   gss_name_t nameHdl;
   511   gss_cred_id_t credHdl;
   535   gss_cred_id_t credHdl;
       
   536   credHdl = GSS_C_NO_CREDENTIAL;
   512 
   537 
   513   debug(env, "[GSSLibStub_acquireCred]");
   538   debug(env, "[GSSLibStub_acquireCred]");
   514 
   539 
   515 
   540 
   516   mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));
   541   mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));
   517   mechs = newGSSOIDSet(env, mech);
   542   mechs = newGSSOIDSet(env, mech);
       
   543   if ((*env)->ExceptionCheck(env)) {
       
   544     return jlong_zero;
       
   545   }
   518   credUsage = (gss_cred_usage_t) usage;
   546   credUsage = (gss_cred_usage_t) usage;
   519   nameHdl = (gss_name_t) jlong_to_ptr(pName);
   547   nameHdl = (gss_name_t) jlong_to_ptr(pName);
   520   credHdl = GSS_C_NO_CREDENTIAL;
       
   521 
   548 
   522   sprintf(debugBuf, "[GSSLibStub_acquireCred] pName=%ld, usage=%d",
   549   sprintf(debugBuf, "[GSSLibStub_acquireCred] pName=%ld, usage=%d",
   523     (long) pName, usage);
   550     (long) pName, usage);
   524   debug(env, debugBuf);
   551   debug(env, debugBuf);
   525 
   552 
   626   nameHdl = GSS_C_NO_NAME;
   653   nameHdl = GSS_C_NO_NAME;
   627   inquireCred(env, jobj, credHdl, TYPE_CRED_NAME, &nameHdl);
   654   inquireCred(env, jobj, credHdl, TYPE_CRED_NAME, &nameHdl);
   628 
   655 
   629   /* return immediately if an exception has occurred */
   656   /* return immediately if an exception has occurred */
   630   if ((*env)->ExceptionCheck(env)) {
   657   if ((*env)->ExceptionCheck(env)) {
   631     return 0;
   658     return jlong_zero;
   632   }
   659   }
   633 
   660 
   634   sprintf(debugBuf, "[GSSLibStub_getCredName] pName=%ld", (long) nameHdl);
   661   sprintf(debugBuf, "[GSSLibStub_getCredName] pName=%ld", (long) nameHdl);
   635   debug(env, debugBuf);
   662   debug(env, debugBuf);
   636 
   663 
   793   flags = (OM_uint32) (*env)->GetIntField(env, jcontextSpi,
   820   flags = (OM_uint32) (*env)->GetIntField(env, jcontextSpi,
   794                                           FID_NativeGSSContext_flags);
   821                                           FID_NativeGSSContext_flags);
   795   time = getGSSTime((*env)->GetIntField(env, jcontextSpi,
   822   time = getGSSTime((*env)->GetIntField(env, jcontextSpi,
   796                                         FID_NativeGSSContext_lifetime));
   823                                         FID_NativeGSSContext_lifetime));
   797   cb = getGSSCB(env, jcb);
   824   cb = getGSSCB(env, jcb);
       
   825   if ((*env)->ExceptionCheck(env)) {
       
   826     return NULL;
       
   827   }
       
   828 
   798   initGSSBuffer(env, jinToken, &inToken);
   829   initGSSBuffer(env, jinToken, &inToken);
   799 
   830 
   800   sprintf(debugBuf,
   831   sprintf(debugBuf,
   801           "[GSSLibStub_initContext] before: pCred=%ld, pContext=%ld",
   832           "[GSSLibStub_initContext] before: pCred=%ld, pContext=%ld",
   802           (long)credHdl, (long)contextHdl);
   833           (long)credHdl, (long)contextHdl);
   893   contextHdl = (gss_ctx_id_t)jlong_to_ptr(
   924   contextHdl = (gss_ctx_id_t)jlong_to_ptr(
   894     (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext));
   925     (*env)->GetLongField(env, jcontextSpi, FID_NativeGSSContext_pContext));
   895   credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);
   926   credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);
   896   initGSSBuffer(env, jinToken, &inToken);
   927   initGSSBuffer(env, jinToken, &inToken);
   897   cb = getGSSCB(env, jcb);
   928   cb = getGSSCB(env, jcb);
       
   929   if ((*env)->ExceptionCheck(env)) {
       
   930     return NULL;
       
   931   }
   898   srcName = GSS_C_NO_NAME;
   932   srcName = GSS_C_NO_NAME;
   899   delCred = GSS_C_NO_CREDENTIAL;
   933   delCred = GSS_C_NO_CREDENTIAL;
   900   setTarget = (credHdl == GSS_C_NO_CREDENTIAL);
   934   setTarget = (credHdl == GSS_C_NO_CREDENTIAL);
   901   aFlags = 0;
   935   aFlags = 0;
   902 
   936 
  1128   }
  1162   }
  1129 
  1163 
  1130   checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContextAll]");
  1164   checkStatus(env, jobj, major, minor, "[GSSLibStub_inquireContextAll]");
  1131   /* return immediately if an exception has occurred */
  1165   /* return immediately if an exception has occurred */
  1132   if ((*env)->ExceptionCheck(env)) {
  1166   if ((*env)->ExceptionCheck(env)) {
  1133     return ptr_to_jlong(NULL);
  1167     return jlong_zero;
  1134   }
  1168   }
  1135 
  1169 
  1136   sprintf(debugBuf, "[GSSLibStub_getContextName] pName=%ld", (long) nameHdl);
  1170   sprintf(debugBuf, "[GSSLibStub_getContextName] pName=%ld", (long) nameHdl);
  1137   debug(env, debugBuf);
  1171   debug(env, debugBuf);
  1138 
  1172