From c241694ccb6de36971a27f144433521f30f92fa3 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 3 Jun 2019 10:44:57 +0200 Subject: check more return values --- src/lib/exchange_api_handle.c | 240 ++++++++++++++++++++++++++---------------- 1 file changed, 151 insertions(+), 89 deletions(-) (limited to 'src/lib') diff --git a/src/lib/exchange_api_handle.c b/src/lib/exchange_api_handle.c index 659301d41..ca4c13da7 100644 --- a/src/lib/exchange_api_handle.c +++ b/src/lib/exchange_api_handle.c @@ -1593,6 +1593,11 @@ TALER_EXCHANGE_serialize_data now = GNUNET_TIME_absolute_get (); signkeys = json_array (); + if (NULL == signkeys) + { + GNUNET_break (0); + return NULL; + } for (unsigned int i=0;inum_sign_keys;i++) { const struct TALER_EXCHANGE_SigningPublicKey *sk = &kd->sign_keys[i]; @@ -1601,30 +1606,42 @@ TALER_EXCHANGE_serialize_data if (now.abs_value_us > sk->valid_until.abs_value_us) continue; /* skip keys that have expired */ signkey = json_pack ("{s:o, s:o, s:o, s:o, s:o}", - "key", - GNUNET_JSON_from_data_auto - (&sk->key), - "master_sig", - GNUNET_JSON_from_data_auto - (&sk->master_sig), - "stamp_start", - GNUNET_JSON_from_time_abs - (sk->valid_from), - "stamp_expire", - GNUNET_JSON_from_time_abs - (sk->valid_until), - "stamp_end", - GNUNET_JSON_from_time_abs - (sk->valid_legal)); + "key", + GNUNET_JSON_from_data_auto + (&sk->key), + "master_sig", + GNUNET_JSON_from_data_auto + (&sk->master_sig), + "stamp_start", + GNUNET_JSON_from_time_abs + (sk->valid_from), + "stamp_expire", + GNUNET_JSON_from_time_abs + (sk->valid_until), + "stamp_end", + GNUNET_JSON_from_time_abs + (sk->valid_legal)); if (NULL == signkey) { GNUNET_break (0); continue; } - json_array_append_new (signkeys, - signkey); + if (0 != json_array_append_new (signkeys, + signkey)) + { + GNUNET_break (0); + json_decref (signkey); + json_decref (signkeys); + return NULL; + } } denoms = json_array (); + if (NULL == denoms) + { + GNUNET_break (0); + json_decref (signkeys); + return NULL; + } for (unsigned int i=0;inum_denom_keys;i++) { const struct TALER_EXCHANGE_DenomPublicKey *dk = &kd->denom_keys[i]; @@ -1633,41 +1650,55 @@ TALER_EXCHANGE_serialize_data if (now.abs_value_us > dk->expire_deposit.abs_value_us) continue; /* skip keys that have expired */ denom = json_pack ("{s:o, s:o, s:o, s:o, s:o " - ",s:o, s:o, s:o, s:o, s:o " - ",s:o}", - "stamp_expire_deposit", - GNUNET_JSON_from_time_abs (dk->expire_deposit), - "stamp_expire_withdraw", - GNUNET_JSON_from_time_abs (dk->withdraw_valid_until), - "stamp_start", - GNUNET_JSON_from_time_abs (dk->valid_from), - "stamp_expire_legal", - GNUNET_JSON_from_time_abs (dk->expire_legal), - "value", - TALER_JSON_from_amount (&dk->value), - "fee_withdraw", - /* #6 */ - TALER_JSON_from_amount (&dk->fee_withdraw), - "fee_deposit", - TALER_JSON_from_amount (&dk->fee_deposit), - "fee_refresh", - TALER_JSON_from_amount (&dk->fee_refresh), - "fee_refund", - TALER_JSON_from_amount (&dk->fee_refund), - "master_sig", - GNUNET_JSON_from_data_auto (&dk->master_sig), - /* #10 */ - "denom_pub", - GNUNET_JSON_from_rsa_public_key (dk->key.rsa_public_key)); + ",s:o, s:o, s:o, s:o, s:o " + ",s:o}", + "stamp_expire_deposit", + GNUNET_JSON_from_time_abs (dk->expire_deposit), + "stamp_expire_withdraw", + GNUNET_JSON_from_time_abs (dk->withdraw_valid_until), + "stamp_start", + GNUNET_JSON_from_time_abs (dk->valid_from), + "stamp_expire_legal", + GNUNET_JSON_from_time_abs (dk->expire_legal), + "value", + TALER_JSON_from_amount (&dk->value), + "fee_withdraw", + /* #6 */ + TALER_JSON_from_amount (&dk->fee_withdraw), + "fee_deposit", + TALER_JSON_from_amount (&dk->fee_deposit), + "fee_refresh", + TALER_JSON_from_amount (&dk->fee_refresh), + "fee_refund", + TALER_JSON_from_amount (&dk->fee_refund), + "master_sig", + GNUNET_JSON_from_data_auto (&dk->master_sig), + /* #10 */ + "denom_pub", + GNUNET_JSON_from_rsa_public_key (dk->key.rsa_public_key)); if (NULL == denom) { GNUNET_break (0); continue; } - json_array_append_new (denoms, - denom); + if (0 == json_array_append_new (denoms, + denom)) + { + GNUNET_break (0); + json_decref (denom); + json_decref (denoms); + json_decref (signkeys); + return NULL; + } } auditors = json_array (); + if (NULL == auditors) + { + GNUNET_break (0); + json_decref (denoms); + json_decref (signkeys); + return NULL; + } for (unsigned int i=0;inum_auditors;i++) { const struct TALER_EXCHANGE_AuditorInformation *ai = &kd->auditors[i]; @@ -1675,6 +1706,14 @@ TALER_EXCHANGE_serialize_data json_t *adenoms; adenoms = json_array (); + if (NULL == adenoms) + { + GNUNET_break (0); + json_decref (denoms); + json_decref (signkeys); + json_decref (auditors); + return NULL; + } for (unsigned int j=0;jnum_denom_keys;j++) { const struct TALER_EXCHANGE_AuditorDenominationInfo *adi = &ai->denom_keys[j]; @@ -1682,69 +1721,92 @@ TALER_EXCHANGE_serialize_data json_t *k; if (now.abs_value_us > dk->expire_deposit.abs_value_us) - continue; /* skip auditor signatures for denomination keys that have expired */ + continue; /* skip auditor signatures for denomination keys that have expired */ GNUNET_assert (adi->denom_key_offset < kd->num_denom_keys); k = json_pack ("{s:o, s:o}", - "denom_pub_h", - GNUNET_JSON_from_data_auto (&dk->h_key), - "auditor_sig", - GNUNET_JSON_from_data_auto (&adi->auditor_sig)); + "denom_pub_h", + GNUNET_JSON_from_data_auto (&dk->h_key), + "auditor_sig", + GNUNET_JSON_from_data_auto (&adi->auditor_sig)); if (NULL == k) { - GNUNET_break (0); - continue; + GNUNET_break (0); + json_decref (adenoms); + json_decref (denoms); + json_decref (signkeys); + json_decref (auditors); + return NULL; + } + if (0 != json_array_append_new (adenoms, + k)) + { + GNUNET_break (0); + json_decref (k); + json_decref (adenoms); + json_decref (denoms); + json_decref (signkeys); + json_decref (auditors); + return NULL; } - json_array_append_new (adenoms, - k); } a = json_pack ("{s:o, s:s, s:o}", - "auditor_pub", - GNUNET_JSON_from_data_auto (&ai->auditor_pub), - "auditor_url", - ai->auditor_url, - "denomination_keys", - adenoms); + "auditor_pub", + GNUNET_JSON_from_data_auto (&ai->auditor_pub), + "auditor_url", + ai->auditor_url, + "denomination_keys", + adenoms); if (NULL == a) { - GNUNET_break (0); - continue; + json_decref (adenoms); + json_decref (denoms); + json_decref (signkeys); + json_decref (auditors); + return NULL; + } + if (0 != json_array_append_new (auditors, + a)) + { + json_decref (a); + json_decref (denoms); + json_decref (signkeys); + json_decref (auditors); + return NULL; } - json_array_append_new (auditors, - a); } keys = json_pack ("{s:s, s:o, s:o, s:o, s:o" - ",s:o, s:o}", - /* 1 */ - "version", - kd->version, - "master_public_key", - GNUNET_JSON_from_data_auto (&kd->master_pub), - "reserve_closing_delay", - GNUNET_JSON_from_time_rel (kd->reserve_closing_delay), - "list_issue_date", - GNUNET_JSON_from_time_abs (kd->list_issue_date), - "signkeys", - signkeys, - /* #6 */ - "denoms", - denoms, - "auditors", - auditors); + ",s:o, s:o}", + /* 1 */ + "version", + kd->version, + "master_public_key", + GNUNET_JSON_from_data_auto (&kd->master_pub), + "reserve_closing_delay", + GNUNET_JSON_from_time_rel (kd->reserve_closing_delay), + "list_issue_date", + GNUNET_JSON_from_time_abs (kd->list_issue_date), + "signkeys", + signkeys, + /* #6 */ + "denoms", + denoms, + "auditors", + auditors); if (NULL == keys) { GNUNET_break (0); return NULL; } return json_pack ("{s:I, s:o, s:s, s:o}", - "version", - (json_int_t) TALER_SERIALIZATION_FORMAT_VERSION, - "expire", - GNUNET_JSON_from_time_abs (exchange->key_data_expiration), - "url", - exchange->url, - "keys", - keys); + "version", + (json_int_t) TALER_SERIALIZATION_FORMAT_VERSION, + "expire", + GNUNET_JSON_from_time_abs (exchange->key_data_expiration), + "url", + exchange->url, + "keys", + keys); } -- cgit v1.2.3