aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/tree-hash.c
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2019-06-14 16:19:45 +0200
committerRiccardo Spagni <ric@spagni.net>2019-06-14 16:19:45 +0200
commit1d5e8f461de0a04891e5e18b0f50e9cf2cf534e1 (patch)
tree196a29f8b13f0a26167d5ec085669002d468323a /src/crypto/tree-hash.c
parentMerge pull request #5632 (diff)
parentrpc: restrict the recent cutoff size in restricted RPC mode (diff)
downloadmonero-1d5e8f461de0a04891e5e18b0f50e9cf2cf534e1.tar.xz
Merge pull request #5639
2eef90d6 rpc: restrict the recent cutoff size in restricted RPC mode (moneromooo-monero) 0564da5f ensure no NULL is passed to memcpy (moneromooo-monero) bc09766b abstract_tcp_server2: improve DoS resistance (moneromooo-monero) 1387549e serialization: check stream good flag at the end (moneromooo-monero) a00cabd4 tree-hash: allocate variable memory on heap, not stack (moneromooo-monero) f2152192 cryptonote: throw on tx hash calculation error (moneromooo-monero) db2b9fba serialization: fail on read_varint error (moneromooo-monero) 68ad5481 cryptonote_protocol: fix another potential P2P DoS (moneromooo-monero) 1cc61018 cryptonote_protocol: expand basic DoS protection (moneromooo-monero) 8f66b705 cryptonote_protocol_handler: prevent potential DoS (anonimal) 39169ace epee: basic sanity check on allocation size from untrusted source (moneromooo-monero)
Diffstat (limited to 'src/crypto/tree-hash.c')
-rw-r--r--src/crypto/tree-hash.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/crypto/tree-hash.c b/src/crypto/tree-hash.c
index 7802fb67f..0a5860f3b 100644
--- a/src/crypto/tree-hash.c
+++ b/src/crypto/tree-hash.c
@@ -30,6 +30,7 @@
#include <assert.h>
#include <stddef.h>
+#include <stdlib.h>
#include <string.h>
#include "hash-ops.h"
@@ -82,23 +83,24 @@ void tree_hash(const char (*hashes)[HASH_SIZE], size_t count, char *root_hash) {
size_t cnt = tree_hash_cnt( count );
- char ints[cnt][HASH_SIZE];
- memset(ints, 0 , sizeof(ints)); // zero out as extra protection for using uninitialized mem
+ char *ints = calloc(cnt, HASH_SIZE); // zero out as extra protection for using uninitialized mem
+ assert(ints);
memcpy(ints, hashes, (2 * cnt - count) * HASH_SIZE);
for (i = 2 * cnt - count, j = 2 * cnt - count; j < cnt; i += 2, ++j) {
- cn_fast_hash(hashes[i], 64, ints[j]);
+ cn_fast_hash(hashes[i], 64, ints + j * HASH_SIZE);
}
assert(i == count);
while (cnt > 2) {
cnt >>= 1;
for (i = 0, j = 0; j < cnt; i += 2, ++j) {
- cn_fast_hash(ints[i], 64, ints[j]);
+ cn_fast_hash(ints + i * HASH_SIZE, 64, ints + j * HASH_SIZE);
}
}
- cn_fast_hash(ints[0], 64, root_hash);
+ cn_fast_hash(ints, 64, root_hash);
+ free(ints);
}
}