aboutsummaryrefslogtreecommitdiffstats
path: root/libkeccak_generalised_sum_fd.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2021-07-27 16:01:30 +0200
committerMattias Andrée <maandree@kth.se>2021-07-27 16:07:05 +0200
commit411e0a694f3ed02e1d98abe923601d511bc15b59 (patch)
tree887856fdaf376eec294c8ef4492c26e66fe977c7 /libkeccak_generalised_sum_fd.c
parentImprove makefile (diff)
downloadlibkeccak-411e0a694f3ed02e1d98abe923601d511bc15b59.tar.gz
libkeccak-411e0a694f3ed02e1d98abe923601d511bc15b59.tar.bz2
libkeccak-411e0a694f3ed02e1d98abe923601d511bc15b59.tar.xz
Add ALLOCA_LIMIT to fix bug #13 on GitHub reported by Justin Gottula
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'libkeccak_generalised_sum_fd.c')
-rw-r--r--libkeccak_generalised_sum_fd.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/libkeccak_generalised_sum_fd.c b/libkeccak_generalised_sum_fd.c
index 879371b..4aa7a94 100644
--- a/libkeccak_generalised_sum_fd.c
+++ b/libkeccak_generalised_sum_fd.c
@@ -33,8 +33,16 @@ libkeccak_generalised_sum_fd(int fd, struct libkeccak_state *restrict state, con
if (attr.st_blksize > 0)
blksize = (size_t)attr.st_blksize;
#endif
-
+
+#if ALLOCA_LIMIT > 0
+ if (blksize > (size_t)ALLOCA_LIMIT)
+ blksize = (size_t)ALLOCA_LIMIT;
chunk = alloca(blksize);
+#else
+ chunk = malloc(blksize);
+ if (!chunk)
+ return -1;
+#endif
for (;;) {
got = read(fd, chunk, blksize);
@@ -43,11 +51,17 @@ libkeccak_generalised_sum_fd(int fd, struct libkeccak_state *restrict state, con
break;
if (errno == EINTR)
continue;
- return -1;
+ goto fail;
}
if (libkeccak_fast_update(state, chunk, (size_t)got) < 0)
- return -1;
+ goto fail;
}
return libkeccak_fast_digest(state, NULL, 0, 0, suffix, hashsum);
+
+fail:
+#if ALLOCA_LIMIT <= 0
+ free(chunk);
+#endif
+ return -1;
}