From: Stefano Babic Date: Tue, 31 Aug 2021 15:02:14 +0000 (+0200) Subject: buzhash: change fingerprint to track OOM X-Git-Tag: archive/raspbian/1.2.1+ds1-1+rpi1^2~7^2~1^2~21^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b044454292cdf907ffc96a262b3b1a331c1d26d5;p=zchunk.git buzhash: change fingerprint to track OOM Function returns false if an error (OOM from calloc) occurs, and the output is stored via pointer passed by caller. Signed-off-by: Stefano Babic --- diff --git a/src/lib/buzhash/buzhash.c b/src/lib/buzhash/buzhash.c index 780febd..9b7d75a 100644 --- a/src/lib/buzhash/buzhash.c +++ b/src/lib/buzhash/buzhash.c @@ -100,11 +100,13 @@ const uint32_t buzhash_table[] = { 0x7bf7cabc, 0xf9c18d66, 0x593ade65, 0xd95ddf11, }; -uint32_t buzhash_update (buzHash *b, const char *s, size_t window) { +bool buzhash_update (buzHash *b, const char *s, size_t window, uint32_t *output) { if(b->window == NULL || b->window_size != window) { if(b->window) free(b->window); b->window = calloc(1, window); + if (!b->window) + return false; assert(b->window); b->window_loc = 0; b->window_fill = 0; @@ -116,10 +118,12 @@ uint32_t buzhash_update (buzHash *b, const char *s, size_t window) { b->window_fill++; if(b->window_fill < b->window_size) { b->h ^= rol32 (buzhash_table[(uint8_t) (*s)], window - b->window_fill); - return 1; + *output = 1; + return true; } else { b->h ^= buzhash_table[(uint8_t) (*s)]; - return b->h; + *output = b->h; + return true; } } b->h = rol32 (b->h, 1) ^ @@ -127,7 +131,8 @@ uint32_t buzhash_update (buzHash *b, const char *s, size_t window) { buzhash_table[(uint8_t) *s]; b->window[b->window_loc++] = *s; b->window_loc %= b->window_size; - return b->h; + *output = b->h; + return true; } void buzhash_reset (buzHash *b) { diff --git a/src/lib/buzhash/buzhash.h b/src/lib/buzhash/buzhash.h index 06f6917..10e9c9e 100644 --- a/src/lib/buzhash/buzhash.h +++ b/src/lib/buzhash/buzhash.h @@ -4,6 +4,7 @@ #include #include #include +#include typedef struct buzHash { uint32_t h; @@ -13,7 +14,7 @@ typedef struct buzHash { int window_fill; } buzHash; -uint32_t buzhash_update (buzHash *b, const char *s, size_t window); +bool buzhash_update (buzHash *b, const char *s, size_t window, uint32_t *output); void buzhash_reset (buzHash *b); #endif diff --git a/src/lib/comp/comp.c b/src/lib/comp/comp.c index a89846c..193ea09 100644 --- a/src/lib/comp/comp.c +++ b/src/lib/comp/comp.c @@ -566,6 +566,7 @@ ssize_t PUBLIC zck_write(zckCtx *zck, const char *src, const size_t src_size) { const char *loc = src; size_t loc_size = src_size; size_t loc_written = 0; + uint32_t buzhash_res; if(zck->manual_chunk) { while(zck->comp.dc_data_size + loc_size > zck->chunk_max_size) { @@ -585,8 +586,12 @@ ssize_t PUBLIC zck_write(zckCtx *zck, const char *src, const size_t src_size) { return src_size; } else { for(size_t i=0; ibuzhash), loc+i, zck->buzhash_width) & - zck->buzhash_bitmask) == 0 || + if (!buzhash_update(&(zck->buzhash), loc+i, zck->buzhash_width, &buzhash_res)) { + zck_log(ZCK_LOG_ERROR, "OOM in buzhash_update"); + return -1; + } + + if((buzhash_res & zck->buzhash_bitmask) == 0 || zck->comp.dc_data_size + i >= zck->chunk_auto_max) { if(comp_write(zck, loc, i) != i) return -1;