}
static krb5_error_code
-kcm_alloc(krb5_context context, const char *name, krb5_ccache *id)
+kcm_alloc(krb5_context context,
+ const char *name,
+ krb5_ccache *id)
{
krb5_kcmcache *k;
if (k != NULL) {
if (k->name != NULL)
free(k->name);
- memset(k, 0, sizeof(*k));
+ memset_s(k, sizeof(*k), 0, sizeof(*k));
krb5_data_free(&(*id)->data);
}
}
-static const char *
-kcm_get_name(krb5_context context,
- krb5_ccache id)
+static krb5_error_code KRB5_CALLCONV
+kcm_get_name_2(krb5_context context,
+ krb5_ccache id,
+ const char **name,
+ const char **col,
+ const char **sub)
{
- return CACHENAME(id);
+ /*
+ * TODO:
+ *
+ * - name should be <IPC-name>:<cache-name>
+ * - col should be <IPC-name>
+ * - sub should be <cache-name>
+ */
+ if (name)
+ *name = CACHENAME(id);
+ if (col)
+ *col = NULL;
+ if (sub)
+ *sub = CACHENAME(id);
+ return 0;
}
static krb5_error_code
-kcm_resolve(krb5_context context, krb5_ccache *id, const char *res)
+kcm_resolve_2(krb5_context context,
+ krb5_ccache *id,
+ const char *res,
+ const char *sub)
{
- return kcm_alloc(context, res, id);
+ /*
+ * For now, for KCM the `res' is the `sub'.
+ *
+ * TODO: We should use `res' as the IPC name instead of the one currently
+ * hard-coded in `kcm_ipc_name'.
+ */
+ return kcm_alloc(context, sub && *sub ? sub : res, id);
}
/*
c = calloc(1, sizeof(*c));
if (c == NULL) {
- ret = ENOMEM;
- krb5_set_error_message(context, ret,
- N_("malloc: out of memory", ""));
+ ret = krb5_enomem(context);
return ret;
}
if (ptr == NULL) {
free(c->uuids);
free(c);
- krb5_set_error_message(context, ENOMEM,
- N_("malloc: out of memory", ""));
- return ENOMEM;
+ return krb5_enomem(context);
}
c->uuids = ptr;
krb5_storage_free(request);
if (ret == KRB5_CC_END) {
goto again;
- }
+ } else if (ret)
+ return ret;
ret = krb5_ret_creds(response, creds);
if (ret)
c = calloc(1, sizeof(*c));
if (c == NULL) {
- ret = ENOMEM;
- krb5_set_error_message(context, ret,
- N_("malloc: out of memory", ""));
+ ret = krb5_enomem(context);
goto out;
}
ptr = realloc(c->uuids, sizeof(c->uuids[0]) * (c->length + 1));
if (ptr == NULL) {
- ret = ENOMEM;
- krb5_set_error_message(context, ret,
- N_("malloc: out of memory", ""));
+ ret = krb5_enomem(context);
goto out;
}
c->uuids = ptr;
krb5_storage_free(request);
if (ret == KRB5_CC_END)
goto again;
+ else if (ret)
+ return ret;
ret = krb5_ret_stringz(response, &name);
krb5_storage_free(response);
ret = krb5_kcm_call(context, request, NULL, NULL);
krb5_storage_free(request);
+
+ if (ret == 0)
+ krb5_cc_destroy(context, from);
return ret;
}
krb5_storage *request, *response;
krb5_data response_data;
char *name;
+ int aret;
*str = NULL;
if (ret)
return ret;
- asprintf(str, "%s:%s", ops->prefix, name);
+ aret = asprintf(str, "%s:%s", ops->prefix, name);
free(name);
- if (str == NULL)
+ if (aret == -1 || str == NULL)
return ENOMEM;
return 0;
*/
KRB5_LIB_VARIABLE const krb5_cc_ops krb5_kcm_ops = {
- KRB5_CC_OPS_VERSION,
+ KRB5_CC_OPS_VERSION_5,
"KCM",
- kcm_get_name,
- kcm_resolve,
+ NULL,
+ NULL,
kcm_gen_new,
kcm_initialize,
kcm_destroy,
kcm_set_default,
kcm_lastchange,
kcm_set_kdc_offset,
- kcm_get_kdc_offset
+ kcm_get_kdc_offset,
+ kcm_get_name_2,
+ kcm_resolve_2
};
KRB5_LIB_VARIABLE const krb5_cc_ops krb5_akcm_ops = {
- KRB5_CC_OPS_VERSION,
+ KRB5_CC_OPS_VERSION_5,
"API",
- kcm_get_name,
- kcm_resolve,
+ NULL,
+ NULL,
kcm_gen_new,
kcm_initialize,
kcm_destroy,
kcm_set_default,
kcm_lastchange,
NULL,
- NULL
+ NULL,
+ kcm_get_name_2,
+ kcm_resolve_2
};