This commit is contained in:
Christian Grothoff 2015-06-11 14:40:07 +02:00
parent 9ff580fe7b
commit 65c19ccbdb
2 changed files with 131 additions and 91 deletions

View File

@ -1003,7 +1003,7 @@ struct TALER_MINTDB_Plugin
* @param session_hash hash to identify refresh session * @param session_hash hash to identify refresh session
* @param cnc_index cut and choose set index (1st dimension) * @param cnc_index cut and choose set index (1st dimension)
* @param num_coins size of the @a commit_coins array * @param num_coins size of the @a commit_coins array
* @param[out] commit_coin array of coin commitments to return * @param[out] commit_coins array of coin commitments to return
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
* #GNUNET_NO if not found * #GNUNET_NO if not found
* #GNUNET_SYSERR on error * #GNUNET_SYSERR on error

View File

@ -2205,24 +2205,29 @@ postgres_insert_refresh_commit_coins (void *cls,
uint16_t num_newcoins, uint16_t num_newcoins,
const struct TALER_MINTDB_RefreshCommitCoin *commit_coins) const struct TALER_MINTDB_RefreshCommitCoin *commit_coins)
{ {
// FIXME: check logic! -- was written for single commit_coin! // #3831
char *rle; char *rle;
size_t rle_size; size_t rle_size;
PGresult *result; PGresult *result;
unsigned int i;
uint16_t coin_off;
rle = TALER_refresh_link_encrypted_encode (commit_coins->refresh_link, for (i=0;i<(unsigned int) num_newcoins;i++)
{
rle = TALER_refresh_link_encrypted_encode (commit_coins[i].refresh_link,
&rle_size); &rle_size);
if (NULL == rle) if (NULL == rle)
{ {
GNUNET_break (0); GNUNET_break (0);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
coin_off = (uint16_t) i;
{ {
struct TALER_PQ_QueryParam params[] = { struct TALER_PQ_QueryParam params[] = {
TALER_PQ_query_param_auto_from_type (session_hash), TALER_PQ_query_param_auto_from_type (session_hash),
TALER_PQ_query_param_uint16 (&cnc_index), TALER_PQ_query_param_uint16 (&cnc_index),
TALER_PQ_query_param_uint16 (&num_newcoins), TALER_PQ_query_param_uint16 (&coin_off),
TALER_PQ_query_param_fixed_size (rle, rle_size), TALER_PQ_query_param_fixed_size (rle,
rle_size),
TALER_PQ_query_param_fixed_size (commit_coins->coin_ev, TALER_PQ_query_param_fixed_size (commit_coins->coin_ev,
commit_coins->coin_ev_size), commit_coins->coin_ev_size),
TALER_PQ_query_param_end TALER_PQ_query_param_end
@ -2246,10 +2251,35 @@ postgres_insert_refresh_commit_coins (void *cls,
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
PQclear (result); PQclear (result);
}
return GNUNET_OK; return GNUNET_OK;
} }
/**
* We allocated some @a commit_coin information, but now need
* to abort. Free allocated memory.
*
* @param commit_coins data to free (but not the array itself)
* @param commit_coins_len length of @a commit_coins array
*/
static void
free_cc_result (struct TALER_MINTDB_RefreshCommitCoin *commit_coins,
unsigned int commit_coins_len)
{
unsigned int i;
for (i=0;i<commit_coins_len;i++)
{
GNUNET_free (commit_coins[i].refresh_link);
commit_coins[i].refresh_link = NULL;
GNUNET_free (commit_coins[i].coin_ev);
commit_coins[i].coin_ev = NULL;
commit_coins[i].coin_ev_size = 0;
}
}
/** /**
* Obtain information about the commitment of the * Obtain information about the commitment of the
* given coin of the given refresh session from the database. * given coin of the given refresh session from the database.
@ -2258,9 +2288,8 @@ postgres_insert_refresh_commit_coins (void *cls,
* @param session database connection to use * @param session database connection to use
* @param session_hash hash to identify refresh session * @param session_hash hash to identify refresh session
* @param cnc_index set index (1st dimension) * @param cnc_index set index (1st dimension)
* @param newcoin_index coin index (2nd dimension), corresponds to refreshed (new) coins * @param num_newcoins size of the @a commit_coins array
* @param[out] cc coin commitment to return * @param[out] commit_coins array of coin commitments to return
* FIXME: should we not take an array of 'cc's and return all at once? // #3831
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
* #GNUNET_NO if not found * #GNUNET_NO if not found
* #GNUNET_SYSERR on error * #GNUNET_SYSERR on error
@ -2270,14 +2299,18 @@ postgres_get_refresh_commit_coins (void *cls,
struct TALER_MINTDB_Session *session, struct TALER_MINTDB_Session *session,
const struct GNUNET_HashCode *session_hash, const struct GNUNET_HashCode *session_hash,
uint16_t cnc_index, uint16_t cnc_index,
uint16_t newcoin_index, uint16_t num_newcoins,
struct TALER_MINTDB_RefreshCommitCoin *cc) struct TALER_MINTDB_RefreshCommitCoin *commit_coins)
{ {
// FIXME: check logic! // #3831 unsigned int i;
for (i=0;i<(unsigned int) num_newcoins;i++)
{
uint16_t newcoin_off = (uint16_t) i;
struct TALER_PQ_QueryParam params[] = { struct TALER_PQ_QueryParam params[] = {
TALER_PQ_query_param_auto_from_type (session_hash), TALER_PQ_query_param_auto_from_type (session_hash),
TALER_PQ_query_param_uint16 (&cnc_index), TALER_PQ_query_param_uint16 (&cnc_index),
TALER_PQ_query_param_uint16 (&newcoin_index), TALER_PQ_query_param_uint16 (&newcoin_off),
TALER_PQ_query_param_end TALER_PQ_query_param_end
}; };
void *c_buf; void *c_buf;
@ -2285,24 +2318,25 @@ postgres_get_refresh_commit_coins (void *cls,
void *rl_buf; void *rl_buf;
size_t rl_buf_size; size_t rl_buf_size;
struct TALER_RefreshLinkEncrypted *rl; struct TALER_RefreshLinkEncrypted *rl;
PGresult *result;
PGresult *result = TALER_PQ_exec_prepared (session->conn, result = TALER_PQ_exec_prepared (session->conn,
"get_refresh_commit_coin", "get_refresh_commit_coin",
params); params);
if (PGRES_TUPLES_OK != PQresultStatus (result)) if (PGRES_TUPLES_OK != PQresultStatus (result))
{ {
BREAK_DB_ERR (result); BREAK_DB_ERR (result);
PQclear (result); PQclear (result);
free_cc_result (commit_coins, i);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
if (0 == PQntuples (result)) if (0 == PQntuples (result))
{ {
PQclear (result); PQclear (result);
free_cc_result (commit_coins, i);
return GNUNET_NO; return GNUNET_NO;
} }
{
struct TALER_PQ_ResultSpec rs[] = { struct TALER_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_variable_size ("link_vector_enc", TALER_PQ_result_spec_variable_size ("link_vector_enc",
&rl_buf, &rl_buf,
@ -2312,24 +2346,30 @@ postgres_get_refresh_commit_coins (void *cls,
&c_buf_size), &c_buf_size),
TALER_PQ_result_spec_end TALER_PQ_result_spec_end
}; };
if (GNUNET_YES != TALER_PQ_extract_result (result, rs, 0))
if (GNUNET_YES !=
TALER_PQ_extract_result (result, rs, 0))
{ {
PQclear (result); PQclear (result);
free_cc_result (commit_coins, i);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
}
PQclear (result); PQclear (result);
if (rl_buf_size < sizeof (struct TALER_CoinSpendPrivateKeyP)) if (rl_buf_size < sizeof (struct TALER_CoinSpendPrivateKeyP))
{ {
GNUNET_free (c_buf); GNUNET_free (c_buf);
GNUNET_free (rl_buf); GNUNET_free (rl_buf);
free_cc_result (commit_coins, i);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
rl = TALER_refresh_link_encrypted_decode (rl_buf, rl = TALER_refresh_link_encrypted_decode (rl_buf,
rl_buf_size); rl_buf_size);
GNUNET_free (rl_buf); GNUNET_free (rl_buf);
cc->refresh_link = rl; commit_coins[i].refresh_link = rl;
cc->coin_ev = c_buf; commit_coins[i].coin_ev = c_buf;
cc->coin_ev_size = c_buf_size; commit_coins[i].coin_ev_size = c_buf_size;
}
return GNUNET_YES; return GNUNET_YES;
} }