diff options
-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; } |