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:
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;