tree-hash: allocate variable memory on heap, not stack

Large amounts might run out of stack

Reported by guidov
This commit is contained in:
moneromooo-monero 2019-04-04 00:15:07 +00:00
parent f215219252
commit a00cabd4f3
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -30,6 +30,7 @@
#include <assert.h> #include <assert.h>
#include <stddef.h> #include <stddef.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "hash-ops.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 ); size_t cnt = tree_hash_cnt( count );
char ints[cnt][HASH_SIZE]; char *ints = calloc(cnt, HASH_SIZE); // zero out as extra protection for using uninitialized mem
memset(ints, 0 , sizeof(ints)); // zero out as extra protection for using uninitialized mem assert(ints);
memcpy(ints, hashes, (2 * cnt - count) * HASH_SIZE); memcpy(ints, hashes, (2 * cnt - count) * HASH_SIZE);
for (i = 2 * cnt - count, j = 2 * cnt - count; j < cnt; i += 2, ++j) { 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); assert(i == count);
while (cnt > 2) { while (cnt > 2) {
cnt >>= 1; cnt >>= 1;
for (i = 0, j = 0; j < cnt; i += 2, ++j) { 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);
} }
} }