gss_cred_id_t gss_cred = GSS_C_NO_CREDENTIAL;
    gss_buffer_desc buffer = GSS_C_EMPTY_BUFFER;
    gss_name_t gss_name = GSS_C_NO_NAME;
-   edg_wll_GssCred tmp_cred = NULL;
    OM_uint32 lifetime;
    char *proxy_file = NULL;
    char *name = NULL;
    name = buffer.value;
    memset(&buffer, 0, sizeof(buffer));
     
-   tmp_cred = calloc(1, sizeof(*tmp_cred));
-   if (tmp_cred == NULL) {
+   *cred = calloc(1, sizeof(**cred));
+   if (*cred == NULL) {
       ret = EDG_WLL_GSS_ERROR_ERRNO;
+      free(name);
       goto end;
    }
 
-   tmp_cred->gss_cred = gss_cred;
+   (*cred)->gss_cred = gss_cred;
    gss_cred = GSS_C_NO_CREDENTIAL;
-   tmp_cred->lifetime = lifetime;
-   tmp_cred->name = name;
+   (*cred)->lifetime = lifetime;
+   (*cred)->name = name;
 
    ret = 0;
 
 }
 
 int
-edg_wll_gss_release_cred(edg_wll_GssCred cred, edg_wll_GssStatus* gss_code)
+edg_wll_gss_release_cred(edg_wll_GssCred *cred, edg_wll_GssStatus* gss_code)
 {
    OM_uint32 maj_stat, min_stat;
    int ret = 0;
    if (gss_code)
       gss_code->major_status = gss_code->minor_status = 0;
 
-   if (cred == NULL)
+   if (cred == NULL || *cred == NULL)
       return ret;
 
-   if (cred->gss_cred) {
-      maj_stat = gss_release_cred(&min_stat, cred->gss_cred); 
+   if ((*cred)->gss_cred) {
+      maj_stat = gss_release_cred(&min_stat, (gss_cred_id_t*)&(*cred)->gss_cred); 
       if (GSS_ERROR(maj_stat)) {
          ret = EDG_WLL_GSS_ERROR_GSS;
          if (gss_code) {
       }
    }
 
-   if (cred->name)
-      free(cred->name);
+   if ((*cred)->name)
+      free((*cred)->name);
 
-   free(cred);
+   free(*cred);
+   *cred = NULL;
 
    return ret;
 }