diff options
author | Mattias Andrée <maandree@kth.se> | 2021-07-27 16:01:30 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2021-07-27 16:07:05 +0200 |
commit | 411e0a694f3ed02e1d98abe923601d511bc15b59 (patch) | |
tree | 887856fdaf376eec294c8ef4492c26e66fe977c7 | |
parent | Improve makefile (diff) | |
download | libkeccak-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>
-rw-r--r-- | common.h | 19 | ||||
-rw-r--r-- | libkeccak_generalised_sum_fd.c | 20 |
2 files changed, 30 insertions, 9 deletions
@@ -2,13 +2,20 @@ #include "libkeccak.h" +#ifndef ALLOCA_LIMIT +# define ALLOCA_LIMIT (16UL << 10) +#endif + + #include <sys/stat.h> -#if defined(__GLIBC__) || defined(__sun) || defined(__CYGWIN__) -# include <alloca.h> -#elif defined(_WIN32) -# include <malloc.h> -# if !defined(alloca) -# define alloca _alloca /* For clang with MS Codegen */ +#if ALLOCA_LIMIT > 0 +# if defined(__GLIBC__) || defined(__sun) || defined(__CYGWIN__) +# include <alloca.h> +# elif defined(_WIN32) +# include <malloc.h> +# if !defined(alloca) +# define alloca _alloca /* For clang with MS Codegen */ +# endif # endif #endif #include <errno.h> 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; } |