summaryrefslogtreecommitdiffstats
path: root/src/lib/krb5
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2012-10-30 17:17:45 -0400
committerGreg Hudson <ghudson@mit.edu>2013-02-13 15:53:29 -0500
commit61116eb28a7520dda1e5febba95ac6ba1e70e6ac (patch)
treeb97891027d346557b73ee82c02e562687ec400b2 /src/lib/krb5
parent884e040c0478c94585395a03dfbb0bbdee7c5ed4 (diff)
downloadkrb5-61116eb28a7520dda1e5febba95ac6ba1e70e6ac.tar.gz
krb5-61116eb28a7520dda1e5febba95ac6ba1e70e6ac.tar.xz
krb5-61116eb28a7520dda1e5febba95ac6ba1e70e6ac.zip
Make internal JSON functions return error codes
Return error codes (0, ENOMEM, or EINVAL) from JSON support functions instead of returning results directly. This makes error handling simpler for functions which assemble JSON objects and then return a krb5_error_code values. Adjust all callers. Use shims in export_cred.c to minimize changes there; it will be redesigned internally in a subsequent commit.
Diffstat (limited to 'src/lib/krb5')
-rw-r--r--src/lib/krb5/krb/get_in_tkt.c32
-rw-r--r--src/lib/krb5/krb/init_creds_ctx.h4
-rw-r--r--src/lib/krb5/krb/preauth2.c19
-rw-r--r--src/lib/krb5/krb/preauth_otp.c128
4 files changed, 84 insertions, 99 deletions
diff --git a/src/lib/krb5/krb/get_in_tkt.c b/src/lib/krb5/krb/get_in_tkt.c
index c88b67a6e..dfec99179 100644
--- a/src/lib/krb5/krb/get_in_tkt.c
+++ b/src/lib/krb5/krb/get_in_tkt.c
@@ -1124,24 +1124,21 @@ save_selected_preauth_type(krb5_context context, krb5_ccache ccache,
static krb5_error_code
clear_cc_config_out_data(krb5_context context, krb5_init_creds_context ctx)
{
- if (ctx->cc_config_out != NULL)
- k5_json_release(ctx->cc_config_out);
- ctx->cc_config_out = k5_json_object_create();
- if (ctx->cc_config_out == NULL)
- return ENOMEM;
- return 0;
+ k5_json_release(ctx->cc_config_out);
+ ctx->cc_config_out = NULL;
+ return k5_json_object_create(&ctx->cc_config_out);
}
static krb5_error_code
read_cc_config_in_data(krb5_context context, krb5_init_creds_context ctx)
{
+ k5_json_value val;
krb5_data config;
char *encoded;
krb5_error_code code;
int i;
- if (ctx->cc_config_in != NULL)
- k5_json_release(ctx->cc_config_in);
+ k5_json_release(ctx->cc_config_in);
ctx->cc_config_in = NULL;
if (ctx->opte->opt_private->in_ccache == NULL)
@@ -1159,16 +1156,15 @@ read_cc_config_in_data(krb5_context context, krb5_init_creds_context ctx)
if (i < 0)
return ENOMEM;
- ctx->cc_config_in = k5_json_decode(encoded);
+ code = k5_json_decode(encoded, &val);
free(encoded);
- if (ctx->cc_config_in == NULL)
- return ENOMEM;
- if (k5_json_get_tid(ctx->cc_config_in) != K5_JSON_TID_OBJECT) {
- k5_json_release(ctx->cc_config_in);
- ctx->cc_config_in = NULL;
+ if (code)
+ return code;
+ if (k5_json_get_tid(val) != K5_JSON_TID_OBJECT) {
+ k5_json_release(val);
return EINVAL;
}
-
+ ctx->cc_config_in = val;
return 0;
}
@@ -1183,9 +1179,9 @@ save_cc_config_out_data(krb5_context context, krb5_ccache ccache,
if (ctx->cc_config_out == NULL ||
k5_json_object_count(ctx->cc_config_out) == 0)
return 0;
- encoded = k5_json_encode(ctx->cc_config_out);
- if (encoded == NULL)
- return ENOMEM;
+ code = k5_json_encode(ctx->cc_config_out, &encoded);
+ if (code)
+ return code;
config = string2data(encoded);
code = krb5_cc_set_config(context, ccache, ctx->cred.server,
KRB5_CC_CONF_PA_CONFIG_DATA, &config);
diff --git a/src/lib/krb5/krb/init_creds_ctx.h b/src/lib/krb5/krb/init_creds_ctx.h
index 5d813914a..1bc90a528 100644
--- a/src/lib/krb5/krb/init_creds_ctx.h
+++ b/src/lib/krb5/krb/init_creds_ctx.h
@@ -50,8 +50,8 @@ struct _krb5_init_creds_context {
struct krb5_responder_context_st rctx;
krb5_preauthtype selected_preauth_type;
krb5_preauthtype allowed_preauth_type;
- void *cc_config_in;
- void *cc_config_out;
+ k5_json_object cc_config_in;
+ k5_json_object cc_config_out;
/* Discovered offset of server time during preauth */
krb5_timestamp pa_offset;
krb5_int32 pa_offset_usec;
diff --git a/src/lib/krb5/krb/preauth2.c b/src/lib/krb5/krb/preauth2.c
index 060f98aa0..74a4f27be 100644
--- a/src/lib/krb5/krb/preauth2.c
+++ b/src/lib/krb5/krb/preauth2.c
@@ -469,22 +469,19 @@ set_cc_config(krb5_context context, krb5_clpreauth_rock rock,
const char *key, const char *data)
{
krb5_init_creds_context ctx = (krb5_init_creds_context)rock;
- k5_json_value value;
- int i;
+ krb5_error_code ret;
+ k5_json_string str;
if (ctx->cc_config_out == NULL)
return ENOENT;
- value = k5_json_string_create(data);
- if (value == NULL)
- return ENOMEM;
-
- i = k5_json_object_set(ctx->cc_config_out, key, value);
- k5_json_release(value);
- if (i < 0)
- return ENOMEM;
+ ret = k5_json_string_create(data, &str);
+ if (ret)
+ return ret;
- return 0;
+ ret = k5_json_object_set(ctx->cc_config_out, key, str);
+ k5_json_release(str);
+ return ret;
}
static struct krb5_clpreauth_callbacks_st callbacks = {
diff --git a/src/lib/krb5/krb/preauth_otp.c b/src/lib/krb5/krb/preauth_otp.c
index e610d47a9..d343683c0 100644
--- a/src/lib/krb5/krb/preauth_otp.c
+++ b/src/lib/krb5/krb/preauth_otp.c
@@ -99,13 +99,13 @@ codec_data_to_value(krb5_data *data, k5_json_object obj, const char *key)
if (data->data == NULL)
return 0;
- str = k5_json_string_create_len(data->data, data->length);
- if (str == NULL)
- return ENOMEM;
+ retval = k5_json_string_create_len(data->data, data->length, &str);
+ if (retval)
+ return retval;
retval = k5_json_object_set(obj, key, str);
k5_json_release(str);
- return retval == 0 ? 0 : ENOMEM;
+ return retval;
}
/* Converts a property of a json object into a krb5_int32. */
@@ -135,25 +135,25 @@ codec_int32_to_value(krb5_int32 int32, k5_json_object obj, const char *key)
if (int32 == -1)
return 0;
- num = k5_json_number_create(int32);
- if (num == NULL)
- return ENOMEM;
+ retval = k5_json_number_create(int32, &num);
+ if (retval)
+ return retval;
retval = k5_json_object_set(obj, key, num);
k5_json_release(num);
- return retval == 0 ? 0 : ENOMEM;
+ return retval;
}
/* Converts a krb5_otp_tokeninfo into a JSON object. */
static krb5_error_code
codec_encode_tokeninfo(krb5_otp_tokeninfo *ti, k5_json_object *out)
{
- krb5_error_code retval = 0;
+ krb5_error_code retval;
k5_json_object obj;
krb5_flags flags;
- obj = k5_json_object_create();
- if (obj == NULL)
+ retval = k5_json_object_create(&obj);
+ if (retval != 0)
goto error;
flags = KRB5_RESPONDER_OTP_FLAGS_COLLECT_TOKEN;
@@ -212,60 +212,51 @@ codec_encode_challenge(krb5_context ctx, krb5_pa_otp_challenge *chl,
k5_json_object obj = NULL, tmp = NULL;
k5_json_string str = NULL;
k5_json_array arr = NULL;
- krb5_error_code retval = 0;
+ krb5_error_code retval;
int i;
- obj = k5_json_object_create();
- if (obj == NULL)
- goto error;
+ retval = k5_json_object_create(&obj);
+ if (retval != 0)
+ goto cleanup;
if (chl->service.data) {
- str = k5_json_string_create_len(chl->service.data,
- chl->service.length);
- if (str == NULL)
- goto error;
+ retval = k5_json_string_create_len(chl->service.data,
+ chl->service.length, &str);
+ if (retval != 0)
+ goto cleanup;
retval = k5_json_object_set(obj, "service", str);
k5_json_release(str);
- if (retval != 0) {
- retval = ENOMEM;
- goto error;
- }
+ if (retval != 0)
+ goto cleanup;
}
- arr = k5_json_array_create();
- if (arr == NULL)
- goto error;
+ retval = k5_json_array_create(&arr);
+ if (retval != 0)
+ goto cleanup;
for (i = 0; chl->tokeninfo[i] != NULL ; i++) {
retval = codec_encode_tokeninfo(chl->tokeninfo[i], &tmp);
if (retval != 0)
- goto error;
+ goto cleanup;
retval = k5_json_array_add(arr, tmp);
k5_json_release(tmp);
- if (retval != 0) {
- retval = ENOMEM;
- goto error;
- }
- }
-
- if (k5_json_object_set(obj, "tokenInfo", arr) != 0) {
- retval = ENOMEM;
- goto error;
+ if (retval != 0)
+ goto cleanup;
}
- *json = k5_json_encode(obj);
- if (*json == NULL)
- goto error;
+ retval = k5_json_object_set(obj, "tokenInfo", arr);
+ if (retval != 0)
+ goto cleanup;
- k5_json_release(arr);
- k5_json_release(obj);
- return 0;
+ retval = k5_json_encode(obj, json);
+ if (retval)
+ goto cleanup;
-error:
+cleanup:
k5_json_release(arr);
k5_json_release(obj);
- return retval == 0 ? ENOMEM : retval;
+ return retval;
}
/* Converts a JSON object into a krb5_responder_otp_tokeninfo. */
@@ -327,8 +318,8 @@ codec_decode_challenge(krb5_context ctx, const char *json)
krb5_error_code retval;
size_t i;
- obj = k5_json_decode(json);
- if (obj == NULL)
+ retval = k5_json_decode(json, &obj);
+ if (retval != 0)
goto error;
if (k5_json_get_tid(obj) != K5_JSON_TID_OBJECT)
@@ -384,7 +375,7 @@ codec_decode_answer(krb5_context context, const char *answer,
krb5_otp_tokeninfo **tis, krb5_otp_tokeninfo **ti,
krb5_data *value, krb5_data *pin)
{
- krb5_error_code retval = EBADMSG;
+ krb5_error_code retval;
k5_json_value val = NULL;
krb5_int32 indx, i;
krb5_data tmp;
@@ -392,8 +383,8 @@ codec_decode_answer(krb5_context context, const char *answer,
if (answer == NULL)
return EBADMSG;
- val = k5_json_decode(answer);
- if (val == NULL)
+ retval = k5_json_decode(answer, &val);
+ if (retval != 0)
goto cleanup;
if (k5_json_get_tid(val) != K5_JSON_TID_OBJECT)
@@ -1196,48 +1187,49 @@ krb5_responder_otp_set_answer(krb5_context ctx, krb5_responder_context rctx,
{
krb5_error_code retval;
k5_json_object obj = NULL;
- k5_json_value val = NULL;
+ k5_json_number num;
+ k5_json_string str;
char *tmp;
- obj = k5_json_object_create();
- if (obj == NULL)
+ retval = k5_json_object_create(&obj);
+ if (retval != 0)
goto error;
- val = k5_json_number_create(ti);
- if (val == NULL)
+ retval = k5_json_number_create(ti, &num);
+ if (retval != 0)
goto error;
- retval = k5_json_object_set(obj, "tokeninfo", val);
- k5_json_release(val);
+ retval = k5_json_object_set(obj, "tokeninfo", num);
+ k5_json_release(num);
if (retval != 0)
goto error;
if (value != NULL) {
- val = k5_json_string_create(value);
- if (val == NULL)
+ retval = k5_json_string_create(value, &str);
+ if (retval != 0)
goto error;
- retval = k5_json_object_set(obj, "value", val);
- k5_json_release(val);
+ retval = k5_json_object_set(obj, "value", str);
+ k5_json_release(str);
if (retval != 0)
goto error;
}
if (pin != NULL) {
- val = k5_json_string_create(pin);
- if (val == NULL)
+ retval = k5_json_string_create(pin, &str);
+ if (retval != 0)
goto error;
- retval = k5_json_object_set(obj, "pin", val);
- k5_json_release(val);
+ retval = k5_json_object_set(obj, "pin", str);
+ k5_json_release(str);
if (retval != 0)
goto error;
}
- tmp = k5_json_encode(obj);
- k5_json_release(obj);
- if (tmp == NULL)
+ retval = k5_json_encode(obj, &tmp);
+ if (retval != 0)
goto error;
+ k5_json_release(obj);
retval = krb5_responder_set_answer(ctx, rctx, KRB5_RESPONDER_QUESTION_OTP,
tmp);
@@ -1246,7 +1238,7 @@ krb5_responder_otp_set_answer(krb5_context ctx, krb5_responder_context rctx,
error:
k5_json_release(obj);
- return ENOMEM;
+ return retval;
}
void KRB5_CALLCONV