exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit 63a91cc8f35e8254bf5c29c5452039605e708dc5
parent c4f0daff5420fd96dfbbdcb0c2b1ed4dcaab9d6e
Author: Christian Grothoff <grothoff@gnunet.org>
Date:   Thu,  1 May 2025 15:01:38 +0200

again fix use of TALER_MHD_parse_json_data() return values

Diffstat:
Msrc/exchange/taler-exchange-httpd_melt_v27.c | 90+++++++++++++++++++++++++++++++++----------------------------------------------
1 file changed, 38 insertions(+), 52 deletions(-)

diff --git a/src/exchange/taler-exchange-httpd_melt_v27.c b/src/exchange/taler-exchange-httpd_melt_v27.c @@ -105,6 +105,7 @@ struct MeltContext */ enum MeltPhase { + MELT_PHASE_PARSE, MELT_PHASE_CHECK_MELT_VALID, MELT_PHASE_CHECK_KEYS, MELT_PHASE_CHECK_COIN_SIGNATURE, @@ -238,10 +239,10 @@ struct MeltContext /** * For all errors related to a particular denomination, i.e. - * MELT_ERROR_DENOMINATION_KEY_UNKNOWN, - * MELT_ERROR_DENOMINATION_EXPIRED, - * MELT_ERROR_DENOMINATION_VALIDITY_IN_FUTURE, - * MELT_ERROR_AGE_RESTRICTION_NOT_SUPPORTED_BY_DENOMINATION, + * #MELT_ERROR_DENOMINATION_KEY_UNKNOWN, + * #MELT_ERROR_DENOMINATION_EXPIRED, + * #MELT_ERROR_DENOMINATION_VALIDITY_IN_FUTURE, + * #MELT_ERROR_AGE_RESTRICTION_NOT_SUPPORTED_BY_DENOMINATION, * we use this one field. */ struct TALER_DenominationHashP denom_h; @@ -371,10 +372,9 @@ clean_melt_rc (struct TEH_RequestContext *rc) * * @param mc melt request context * @param root json body of the request - * @return GNUNET_OK on success, GNUNET_SYSERR otherwise (response sent) */ -static enum GNUNET_GenericReturnValue -melt_new_request ( +static void +phase_parse_request ( struct MeltContext *mc, const json_t *root) { @@ -416,8 +416,10 @@ melt_new_request ( if (GNUNET_OK != res) { GNUNET_break_op (0); - mc->phase = MELT_PHASE_RETURN_NO; - return GNUNET_NO; + mc->phase = (GNUNET_NO == res) + ? MELT_PHASE_RETURN_YES + : MELT_PHASE_RETURN_NO; + return; } /* validate array size */ @@ -429,12 +431,11 @@ melt_new_request ( if (0 == mc->request.refresh.num_coins) { GNUNET_break_op (0); - GNUNET_JSON_parse_free (spec); SET_ERROR_WITH_DETAIL (mc, MELT_ERROR_REQUEST_PARAMETER_MALFORMED, request_parameter_malformed, "denoms_h must not be empty"); - return GNUNET_NO; + return; } else if (TALER_MAX_COINS < mc->request.refresh.num_coins) { @@ -444,22 +445,20 @@ melt_new_request ( * from it. Note that the user can't get their money back in this case! */ GNUNET_break_op (0); - GNUNET_JSON_parse_free (spec); SET_ERROR_WITH_DETAIL (mc, MELT_ERROR_REQUEST_PARAMETER_MALFORMED, request_parameter_malformed, "maximum number of coins that can be refreshed has been exceeded"); - return GNUNET_NO; + return; } else if ((TALER_CNC_KAPPA) != json_array_size (j_coin_evs)) { GNUNET_break_op (0); - GNUNET_JSON_parse_free (spec); SET_ERROR_WITH_DETAIL (mc, MELT_ERROR_REQUEST_PARAMETER_MALFORMED, request_parameter_malformed, "coin_evs must be an array of length "TALER_CNC_KAPPA_STR); - return GNUNET_NO; + return; } /* Extract the denomination hashes */ @@ -481,12 +480,13 @@ melt_new_request ( res = TALER_MHD_parse_json_data (mc->rc->connection, value, ispec); - if (GNUNET_OK != res) + if (GNUNET_YES != res) { GNUNET_break_op (0); - GNUNET_JSON_parse_free (spec); - mc->phase = MELT_PHASE_RETURN_NO; - return GNUNET_NO; + mc->phase = (GNUNET_NO == res) + ? MELT_PHASE_RETURN_YES + : MELT_PHASE_RETURN_NO; + return; } } } @@ -517,12 +517,11 @@ melt_new_request ( if (mc->request.refresh.num_coins != json_array_size (j_kappa_planchets)) { GNUNET_break_op (0); - GNUNET_JSON_parse_free (spec); SET_ERROR_WITH_DETAIL (mc, MELT_ERROR_REQUEST_PARAMETER_MALFORMED, request_parameter_malformed, "coin_evs[] size"); - return GNUNET_NO; + return; } json_array_foreach (j_kappa_planchets, idx, j_cev) @@ -541,9 +540,10 @@ melt_new_request ( if (GNUNET_OK != res) { GNUNET_break_op (0); - GNUNET_JSON_parse_free (spec); - mc->phase = MELT_PHASE_RETURN_NO; - return GNUNET_NO; + mc->phase = (GNUNET_NO == res) + ? MELT_PHASE_RETURN_YES + : MELT_PHASE_RETURN_NO; + return; } /* Check for duplicate planchets. Technically a bug on * the client side that is harmless for us, but still @@ -562,10 +562,9 @@ melt_new_request ( { GNUNET_break_op (0); GNUNET_JSON_parse_free (kspec); - GNUNET_JSON_parse_free (spec); SET_ERROR (mc, MELT_ERROR_IDEMPOTENT_PLANCHET); - return GNUNET_NO; + return; } } } @@ -587,7 +586,15 @@ melt_new_request ( ctx, &mc->request.refresh.planchets_h.hash); } - return GNUNET_OK; + mc->ksh = TEH_keys_get_state (); + if (NULL == mc->ksh) + { + GNUNET_break (0); + SET_ERROR (mc, + MELT_ERROR_KEYS_MISSING); + return; + } + mc->phase = MELT_PHASE_CHECK_MELT_VALID; } @@ -1667,10 +1674,8 @@ TEH_handler_melt_v27 ( { struct MeltContext *mc = rc->rh_ctx; - enum GNUNET_GenericReturnValue r; (void) args; - if (NULL == mc) { mc = GNUNET_new (struct MeltContext); @@ -1678,29 +1683,6 @@ TEH_handler_melt_v27 ( rc->rh_cleaner = &clean_melt_rc; mc->rc = rc; mc->now = GNUNET_TIME_timestamp_get (); - r = melt_new_request (mc, - root); - switch (r) - { - case GNUNET_SYSERR: - return MHD_NO; - case GNUNET_OK: - mc->phase = MELT_PHASE_CHECK_MELT_VALID; - mc->ksh = TEH_keys_get_state (); - if (NULL == mc->ksh) - { - GNUNET_break (0); - SET_ERROR (mc, - MELT_ERROR_KEYS_MISSING); - } - break; - case GNUNET_NO: - mc->phase = MELT_PHASE_GENERATE_REPLY_ERROR; - break; - default: - GNUNET_break (0); - return MHD_NO; - } } while (true) @@ -1710,6 +1692,10 @@ TEH_handler_melt_v27 ( mc->phase); switch (mc->phase) { + case MELT_PHASE_PARSE: + phase_parse_request (mc, + root); + break; case MELT_PHASE_CHECK_MELT_VALID: phase_check_melt_valid (mc); break;