diff options
| author | Greg Hudson <ghudson@mit.edu> | 2012-10-30 17:17:45 -0400 |
|---|---|---|
| committer | Greg Hudson <ghudson@mit.edu> | 2013-02-13 15:53:29 -0500 |
| commit | 61116eb28a7520dda1e5febba95ac6ba1e70e6ac (patch) | |
| tree | b97891027d346557b73ee82c02e562687ec400b2 /src/lib/krb5 | |
| parent | 884e040c0478c94585395a03dfbb0bbdee7c5ed4 (diff) | |
| download | krb5-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.c | 32 | ||||
| -rw-r--r-- | src/lib/krb5/krb/init_creds_ctx.h | 4 | ||||
| -rw-r--r-- | src/lib/krb5/krb/preauth2.c | 19 | ||||
| -rw-r--r-- | src/lib/krb5/krb/preauth_otp.c | 128 |
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 |
