diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-03-05 18:17:42 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-03-05 18:17:42 +0100 |
commit | b613bac566a695c4e122acfb4613f236bcb0d151 (patch) | |
tree | de4cdb529ec854810ba9de051376c1b19617d131 /src/backend | |
parent | 467b2f8663432869af24183b039c0f501d4babcf (diff) | |
download | merchant-b613bac566a695c4e122acfb4613f236bcb0d151.tar.gz merchant-b613bac566a695c4e122acfb4613f236bcb0d151.tar.bz2 merchant-b613bac566a695c4e122acfb4613f236bcb0d151.zip |
fix misc memory leaks
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/taler-merchant-httpd.c | 6 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_history.c | 38 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_pay.c | 97 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_proposal.c | 19 |
4 files changed, 89 insertions, 71 deletions
diff --git a/src/backend/taler-merchant-httpd.c b/src/backend/taler-merchant-httpd.c index 759719e2..f13b8911 100644 --- a/src/backend/taler-merchant-httpd.c +++ b/src/backend/taler-merchant-httpd.c @@ -254,6 +254,7 @@ hashmap_free (void *cls, struct MerchantInstance *mi = value; json_decref (mi->j_wire); + GNUNET_free (mi->id); GNUNET_free (mi->keyfile); GNUNET_free (mi); return GNUNET_YES; @@ -501,11 +502,6 @@ instances_iterator_cb (void *cls, &mi->pubkey.eddsa_pub); GNUNET_free (pk); - /** - * FIXME: 'token' must NOT be freed, as it is handled by the - * gnunet_configuration facility. OTOH mi->id does need to be freed, - * because it is a duplicate. - */ mi->id = GNUNET_strdup (token + 1); if (0 == strcmp ("default", mi->id)) iic->default_instance = GNUNET_YES; diff --git a/src/backend/taler-merchant-httpd_history.c b/src/backend/taler-merchant-httpd_history.c index 73aab876..2e530e9a 100644 --- a/src/backend/taler-merchant-httpd_history.c +++ b/src/backend/taler-merchant-httpd_history.c @@ -78,11 +78,11 @@ pd_cb (void *cls, current, start, delta); - GNUNET_break (NULL != (entry = json_pack ("{s:s, s:O, s:s, s:s}", + GNUNET_break (NULL != (entry = json_pack ("{s:s, s:O, s:O, s:O}", "order_id", order_id, "amount", amount, - "timestamp", json_string_value (timestamp), - "instance", json_string_value (instance)))); + "timestamp", timestamp, + "instance", instance))); GNUNET_break (0 == json_array_append_new (response, entry)); @@ -128,17 +128,22 @@ MH_handler_history (struct TMH_RequestHandler *rh, if (NULL != str) { if (1 != sscanf (str, "%llu", &seconds)) - return TMH_RESPONSE_reply_arg_invalid (connection, - TALER_EC_PARAMETER_MALFORMED, - "date"); + { + json_decref (response); + return TMH_RESPONSE_reply_arg_invalid (connection, + TALER_EC_PARAMETER_MALFORMED, + "date"); + } } date.abs_value_us = seconds * 1000LL * 1000LL; if (date.abs_value_us / 1000LL / 1000LL != seconds) + { + json_decref (response); return TMH_RESPONSE_reply_bad_request (connection, TALER_EC_HISTORY_TIMESTAMP_OVERFLOW, "Timestamp overflowed"); - + } mi = TMH_lookup_instance ("default"); @@ -149,10 +154,12 @@ MH_handler_history (struct TMH_RequestHandler *rh, mi = TMH_lookup_instance (str); if (NULL == mi) + { + json_decref (response); return TMH_RESPONSE_reply_not_found (connection, TALER_EC_HISTORY_INSTANCE_UNKNOWN, "instance"); - + } start = 0; delta = 20; @@ -163,9 +170,12 @@ MH_handler_history (struct TMH_RequestHandler *rh, { if ((1 != sscanf (str, "%d", &start)) || start < 0) + { + json_decref (response); return TMH_RESPONSE_reply_arg_invalid (connection, TALER_EC_PARAMETER_MALFORMED, "start"); + } } str = MHD_lookup_connection_value (connection, @@ -191,17 +201,21 @@ MH_handler_history (struct TMH_RequestHandler *rh, response); current = 0; if (GNUNET_SYSERR == ret) + { + json_decref (response); return TMH_RESPONSE_reply_internal_error (connection, TALER_EC_HISTORY_DB_FETCH_ERROR, "db error to get history"); - + } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "history data: %s\n", json_dumps (response, JSON_INDENT (1))); - return TMH_RESPONSE_reply_json (connection, - response, - MHD_HTTP_OK); + ret = TMH_RESPONSE_reply_json (connection, + response, + MHD_HTTP_OK); + json_decref (response); + return ret; } /* end of taler-merchant-httpd_history.c */ diff --git a/src/backend/taler-merchant-httpd_pay.c b/src/backend/taler-merchant-httpd_pay.c index 2d86a12b..91860ca2 100644 --- a/src/backend/taler-merchant-httpd_pay.c +++ b/src/backend/taler-merchant-httpd_pay.c @@ -347,10 +347,11 @@ sign_success_response (struct PayContext *pc) &mr.purpose, &sig); - return TMH_RESPONSE_make_json_pack ("{s:O, s:s, s:o}", - "proposal_data", pc->proposal_data, + return TMH_RESPONSE_make_json_pack ("{s:O, s:o, s:o}", + "proposal_data", + pc->proposal_data, "sig", - json_string_value (GNUNET_JSON_from_data_auto (&sig)), + GNUNET_JSON_from_data_auto (&sig), "h_proposal_data", GNUNET_JSON_from_data (&pc->h_proposal_data, sizeof (struct GNUNET_HashCode))); @@ -451,9 +452,9 @@ deposit_cb (void *cls, if (0 != pc->pending) return; /* still more to do */ - - - resume_pay_with_response (pc, MHD_HTTP_OK, sign_success_response (pc)); + resume_pay_with_response (pc, + MHD_HTTP_OK, + sign_success_response (pc)); } @@ -914,7 +915,9 @@ transaction_double_check (void *cls, * @return #GNUNET_YES on success */ static int -parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *pc) +parse_pay (struct MHD_Connection *connection, + const json_t *root, + struct PayContext *pc) { json_t *coins; json_t *coin; @@ -940,19 +943,17 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p GNUNET_break (0); return res; } - res = db->find_proposal_data (db->cls, &pc->proposal_data, order_id, &merchant_pub); - - if (GNUNET_OK != res) { - - if (MHD_YES != TMH_RESPONSE_reply_not_found (connection, - TALER_EC_PAY_DB_STORE_PAY_ERROR, - "Proposal not found")) + GNUNET_JSON_parse_free (spec); + if (MHD_YES != + TMH_RESPONSE_reply_not_found (connection, + TALER_EC_PAY_DB_STORE_PAY_ERROR, + "Proposal not found")) { GNUNET_break (0); return GNUNET_SYSERR; @@ -960,12 +961,15 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p return GNUNET_NO; } - - if (GNUNET_OK != TALER_JSON_hash (pc->proposal_data, &pc->h_proposal_data)) + if (GNUNET_OK != + TALER_JSON_hash (pc->proposal_data, + &pc->h_proposal_data)) { - if (MHD_YES != TMH_RESPONSE_reply_internal_error (connection, - TALER_EC_NONE, - "Can not hash proposal")) + GNUNET_JSON_parse_free (spec); + if (MHD_YES != + TMH_RESPONSE_reply_internal_error (connection, + TALER_EC_NONE, + "Can not hash proposal")) { GNUNET_break (0); return GNUNET_SYSERR; @@ -973,15 +977,18 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p return GNUNET_NO; } - - merchant = json_object_get (pc->proposal_data, "merchant"); + merchant = json_object_get (pc->proposal_data, + "merchant"); if (NULL == merchant) { - // invalid contract: + GNUNET_JSON_parse_free (spec); + /* invalid contract */ GNUNET_break (0); - if (MHD_YES != TMH_RESPONSE_reply_internal_error (connection, - TALER_EC_NONE, - "No merchant field in contract")) + // FIXME: define proper EC for this! + if (MHD_YES != + TMH_RESPONSE_reply_internal_error (connection, + TALER_EC_NONE, + "No merchant field in contract")) { GNUNET_break (0); return GNUNET_SYSERR; @@ -994,6 +1001,7 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Not able to find the specified instance\n"); + GNUNET_JSON_parse_free (spec); if (MHD_NO == TMH_RESPONSE_reply_not_found (connection, TALER_EC_PAY_INSTANCE_UNKNOWN, "Unknown instance given")) @@ -1013,8 +1021,6 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Parsed JSON for /pay.\n"); - - { struct GNUNET_JSON_Specification espec[] = { GNUNET_JSON_spec_absolute_time ("refund_deadline", @@ -1040,7 +1046,9 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p return (GNUNET_NO == res) ? MHD_YES : MHD_NO; } - pc->wire_transfer_deadline = GNUNET_TIME_absolute_add (pc->timestamp, wire_transfer_delay); + pc->wire_transfer_deadline + = GNUNET_TIME_absolute_add (pc->timestamp, + wire_transfer_delay); if (pc->wire_transfer_deadline.abs_value_us < pc->refund_deadline.abs_value_us) { @@ -1052,7 +1060,8 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p } } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "parsed timestamps\n"); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "parsed timestamps\n"); pc->coins_cnt = json_array_size (coins); @@ -1086,7 +1095,6 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p if (GNUNET_YES != res) { GNUNET_JSON_parse_free (spec); - json_decref (root); GNUNET_break (0); return (GNUNET_NO == res) ? MHD_YES : MHD_NO; } @@ -1106,12 +1114,10 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p dc->pc = pc; } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "parsed coins\n"); - + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "parsed coins\n"); pc->pending = pc->coins_cnt; - GNUNET_JSON_parse_free (spec); - return GNUNET_OK; } @@ -1121,14 +1127,16 @@ parse_pay (struct MHD_Connection *connection, json_t *root, struct PayContext *p */ static int handler_pay_json (struct MHD_Connection *connection, - json_t *root, + const json_t *root, struct PayContext *pc) { int ret; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "about to parse '/pay' body\n"); - - ret = parse_pay (connection, root, pc); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "about to parse '/pay' body\n"); + ret = parse_pay (connection, + root, + pc); if (GNUNET_OK != ret) return ret; @@ -1229,7 +1237,7 @@ handler_pay_json (struct MHD_Connection *connection, &pc->mi->pubkey, &transaction_double_check, NULL)) - GNUNET_break (0); + GNUNET_break (0); } MHD_suspend_connection (connection); @@ -1301,11 +1309,8 @@ MH_handler_pay (struct TMH_RequestHandler *rh, res = MHD_queue_response (connection, pc->response_code, pc->response); - if (NULL != pc->response) - { - MHD_destroy_response (pc->response); - pc->response = NULL; - } + MHD_destroy_response (pc->response); + pc->response = NULL; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Queueing response (%u) for /pay (%s).\n", (unsigned int) pc->response_code, @@ -1332,7 +1337,9 @@ MH_handler_pay (struct TMH_RequestHandler *rh, if ((GNUNET_NO == res) || (NULL == root)) return MHD_YES; /* the POST's body has to be further fetched */ - res = handler_pay_json (connection, root, pc); + res = handler_pay_json (connection, + root, + pc); json_decref (root); if (GNUNET_SYSERR == res) return MHD_NO; diff --git a/src/backend/taler-merchant-httpd_proposal.c b/src/backend/taler-merchant-httpd_proposal.c index ac71653a..09b221ee 100644 --- a/src/backend/taler-merchant-httpd_proposal.c +++ b/src/backend/taler-merchant-httpd_proposal.c @@ -127,8 +127,9 @@ get_instance (struct json_t *json); * @param order to process * @return MHD result code */ -int -proposal_put (struct MHD_Connection *connection, json_t *order) +static int +proposal_put (struct MHD_Connection *connection, + json_t *order) { int res; struct MerchantInstance *mi; @@ -171,7 +172,7 @@ proposal_put (struct MHD_Connection *connection, json_t *order) off = strftime (buf, sizeof (buf), "%H:%M:%S", tm_info); snprintf (buf + off, sizeof (buf) - off, - "-%llX", + "-%llX", (long long unsigned) GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX)); json_object_set (order, "order_id", json_string (buf)); } @@ -210,7 +211,7 @@ proposal_put (struct MHD_Connection *connection, json_t *order) TALER_EC_NONE, "Impossible to parse the order"); } - + /* check contract is well-formed */ if (GNUNET_OK != check_products (products)) @@ -225,7 +226,7 @@ proposal_put (struct MHD_Connection *connection, json_t *order) if (NULL == mi) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Not able to find the specified instance\n"); + "Not able to find the specified instance\n"); return TMH_RESPONSE_reply_not_found (connection, TALER_EC_CONTRACT_INSTANCE_UNKNOWN, "Unknown instance given"); @@ -272,7 +273,7 @@ proposal_put (struct MHD_Connection *connection, json_t *order) TALER_EC_PROPOSAL_STORE_DB_ERROR, "db error: could not store this proposal's data into db"); } - + res = TMH_RESPONSE_reply_json_pack (connection, MHD_HTTP_OK, @@ -396,7 +397,7 @@ MH_handler_proposal_lookup (struct TMH_RequestHandler *rh, order_id, &mi->pubkey); if (GNUNET_NO == res) - return TMH_RESPONSE_reply_not_found (connection, + return TMH_RESPONSE_reply_not_found (connection, TALER_EC_PROPOSAL_LOOKUP_NOT_FOUND, "unknown transaction id"); @@ -405,10 +406,10 @@ MH_handler_proposal_lookup (struct TMH_RequestHandler *rh, TALER_EC_PROPOSAL_LOOKUP_DB_ERROR, "An error occurred while retrieving proposal data from db"); - + return TMH_RESPONSE_reply_json (connection, proposal_data, - MHD_HTTP_OK); + MHD_HTTP_OK); } |