aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changes/bug12169_simple5
-rw-r--r--src/or/relay.c10
2 files changed, 10 insertions, 5 deletions
diff --git a/changes/bug12169_simple b/changes/bug12169_simple
new file mode 100644
index 000000000..f9a300775
--- /dev/null
+++ b/changes/bug12169_simple
@@ -0,0 +1,5 @@
+ o Minor bugfixes (performance):
+ - Avoid using tor_memeq() for checking relay cell integrity.
+ This removes a possible performance bottleneck. Fixes part of bug
+ 12169; bugfix on 0.2.1.31.
+
diff --git a/src/or/relay.c b/src/or/relay.c
index 5c430a6d7..509d7ced0 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -111,14 +111,14 @@ relay_set_digest(crypto_digest_t *digest, cell_t *cell)
static int
relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
{
- char received_integrity[4], calculated_integrity[4];
+ uint32_t received_integrity, calculated_integrity;
relay_header_t rh;
crypto_digest_t *backup_digest=NULL;
backup_digest = crypto_digest_dup(digest);
relay_header_unpack(&rh, cell->payload);
- memcpy(received_integrity, rh.integrity, 4);
+ memcpy(&received_integrity, rh.integrity, 4);
memset(rh.integrity, 0, 4);
relay_header_pack(cell->payload, &rh);
@@ -127,15 +127,15 @@ relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
// received_integrity[2], received_integrity[3]);
crypto_digest_add_bytes(digest, (char*) cell->payload, CELL_PAYLOAD_SIZE);
- crypto_digest_get_digest(digest, calculated_integrity, 4);
+ crypto_digest_get_digest(digest, (char*) &calculated_integrity, 4);
- if (tor_memneq(received_integrity, calculated_integrity, 4)) {
+ if (calculated_integrity != received_integrity) {
// log_fn(LOG_INFO,"Recognized=0 but bad digest. Not recognizing.");
// (%d vs %d).", received_integrity, calculated_integrity);
/* restore digest to its old form */
crypto_digest_assign(digest, backup_digest);
/* restore the relay header */
- memcpy(rh.integrity, received_integrity, 4);
+ memcpy(rh.integrity, &received_integrity, 4);
relay_header_pack(cell->payload, &rh);
crypto_digest_free(backup_digest);
return 0;