aboutsummaryrefslogtreecommitdiff
path: root/src/secretsharing
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2014-04-14 23:29:44 +0000
committerFlorian Dold <florian.dold@gmail.com>2014-04-14 23:29:44 +0000
commit3401695f0825a3b64092a6983242a4f995a03ab3 (patch)
tree79e5f7b9d507a31f4c3f56e5f5c57bf5e5085afd /src/secretsharing
parentb6cc69953e7669e31db2a194d11ae134e8dfb86d (diff)
downloadgnunet-3401695f0825a3b64092a6983242a4f995a03ab3.tar.gz
gnunet-3401695f0825a3b64092a6983242a4f995a03ab3.zip
fix lots of memory leaks in secretsharing decryption
Diffstat (limited to 'src/secretsharing')
-rw-r--r--src/secretsharing/gnunet-secretsharing-profiler.c5
-rw-r--r--src/secretsharing/gnunet-service-secretsharing.c51
2 files changed, 53 insertions, 3 deletions
diff --git a/src/secretsharing/gnunet-secretsharing-profiler.c b/src/secretsharing/gnunet-secretsharing-profiler.c
index 5dc649178..79fa339cf 100644
--- a/src/secretsharing/gnunet-secretsharing-profiler.c
+++ b/src/secretsharing/gnunet-secretsharing-profiler.c
@@ -294,7 +294,7 @@ decrypt_disconnect_adapter(void *cls, void *op_result)
294 *dh = NULL; 294 *dh = NULL;
295 } 295 }
296 296
297 GNUNET_assert (NULL == connect_ops[n]); 297 GNUNET_assert (NULL != connect_ops[n]);
298 connect_ops[n] = NULL; 298 connect_ops[n] = NULL;
299} 299}
300 300
@@ -493,7 +493,10 @@ handle_shutdown (void *cls,
493 unsigned int i; 493 unsigned int i;
494 for (i = 0; i < num_peers; i++) 494 for (i = 0; i < num_peers; i++)
495 if (NULL != connect_ops[i]) 495 if (NULL != connect_ops[i])
496 {
497 // the disconnect callback will set the op to NULL
496 GNUNET_TESTBED_operation_done (connect_ops[i]); 498 GNUNET_TESTBED_operation_done (connect_ops[i]);
499 }
497 GNUNET_free (connect_ops); 500 GNUNET_free (connect_ops);
498 } 501 }
499 502
diff --git a/src/secretsharing/gnunet-service-secretsharing.c b/src/secretsharing/gnunet-service-secretsharing.c
index f169a1655..1e19df5ff 100644
--- a/src/secretsharing/gnunet-service-secretsharing.c
+++ b/src/secretsharing/gnunet-service-secretsharing.c
@@ -558,6 +558,27 @@ decrypt_session_destroy (struct DecryptSession *ds)
558 ds->consensus = NULL; 558 ds->consensus = NULL;
559 } 559 }
560 560
561 if (NULL != ds->info)
562 {
563 unsigned int i;
564 for (i = 0; i < ds->share->num_peers; i++)
565 {
566 if (NULL != ds->info[i].partial_decryption)
567 {
568 gcry_mpi_release (ds->info[i].partial_decryption);
569 ds->info[i].partial_decryption = NULL;
570 }
571 }
572 GNUNET_free (ds->info);
573 ds->info = NULL;
574 }
575
576 if (NULL != ds->share)
577 {
578 GNUNET_SECRETSHARING_share_destroy (ds->share);
579 ds->share = NULL;
580 }
581
561 if (NULL != ds->client_mq) 582 if (NULL != ds->client_mq)
562 { 583 {
563 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "destroying decrypt MQ\n"); 584 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "destroying decrypt MQ\n");
@@ -1429,6 +1450,14 @@ decrypt_conclude (void *cls)
1429 1450
1430 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "sent decrypt done to client\n"); 1451 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "sent decrypt done to client\n");
1431 1452
1453 GNUNET_free (indices);
1454
1455 gcry_mpi_release(lagrange);
1456 gcry_mpi_release(m);
1457 gcry_mpi_release(tmp);
1458 gcry_mpi_release(prod);
1459 gcry_mpi_release(c_2);
1460
1432 // FIXME: what if not enough peers participated? 1461 // FIXME: what if not enough peers participated?
1433} 1462}
1434 1463
@@ -1568,7 +1597,7 @@ decrypt_new_element (void *cls,
1568 session->share->my_peer, info - session->info, tmp1_str, tmp2_str); 1597 session->share->my_peer, info - session->info, tmp1_str, tmp2_str);
1569 GNUNET_free (tmp1_str); 1598 GNUNET_free (tmp1_str);
1570 GNUNET_free (tmp2_str); 1599 GNUNET_free (tmp2_str);
1571 // return; 1600 goto cleanup;
1572 } 1601 }
1573 1602
1574 1603
@@ -1582,12 +1611,22 @@ decrypt_new_element (void *cls,
1582 { 1611 {
1583 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "P%u: Received invalid partial decryption from P%u (eqn 2)\n", 1612 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "P%u: Received invalid partial decryption from P%u (eqn 2)\n",
1584 session->share->my_peer, info - session->info); 1613 session->share->my_peer, info - session->info);
1585 // return; 1614 goto cleanup;
1586 } 1615 }
1587 1616
1588 1617
1589 GNUNET_CRYPTO_mpi_scan_unsigned (&info->partial_decryption, &d->partial_decryption, 1618 GNUNET_CRYPTO_mpi_scan_unsigned (&info->partial_decryption, &d->partial_decryption,
1590 GNUNET_SECRETSHARING_ELGAMAL_BITS / 8); 1619 GNUNET_SECRETSHARING_ELGAMAL_BITS / 8);
1620cleanup:
1621 gcry_mpi_release (tmp1);
1622 gcry_mpi_release (tmp2);
1623 gcry_mpi_release (sigma);
1624 gcry_mpi_release (commit1);
1625 gcry_mpi_release (commit2);
1626 gcry_mpi_release (r);
1627 gcry_mpi_release (w);
1628 gcry_mpi_release (challenge);
1629 gcry_mpi_release (c1);
1591} 1630}
1592 1631
1593 1632
@@ -1691,6 +1730,14 @@ insert_decrypt_element (struct DecryptSession *ds)
1691 GNUNET_CONSENSUS_insert (ds->consensus, &element, NULL, NULL); 1730 GNUNET_CONSENSUS_insert (ds->consensus, &element, NULL, NULL);
1692 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "P%u: Inserting decrypt element done!\n", 1731 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "P%u: Inserting decrypt element done!\n",
1693 ds->share->my_peer); 1732 ds->share->my_peer);
1733
1734 gcry_mpi_release (s);
1735 gcry_mpi_release (w);
1736 gcry_mpi_release (c1);
1737 gcry_mpi_release (beta);
1738 gcry_mpi_release (tmp);
1739 gcry_mpi_release (challenge);
1740 gcry_mpi_release (sigma);
1694} 1741}
1695 1742
1696 1743