buzhash: change fingerprint to track OOM
authorStefano Babic <sbabic@denx.de>
Tue, 31 Aug 2021 15:02:14 +0000 (17:02 +0200)
committerStefano Babic <sbabic@denx.de>
Tue, 31 Aug 2021 15:43:12 +0000 (17:43 +0200)
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 <sbabic@denx.de>
src/lib/buzhash/buzhash.c
src/lib/buzhash/buzhash.h
src/lib/comp/comp.c

index 780febd4c7fbc9ba7646d79e921ee87f3b76e527..9b7d75a0805f7a4549a0e10ed0790c0c4a404708 100644 (file)
@@ -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) {
index 06f69179791eaec474e85abfadd8899a5787c986..10e9c9e7e161307dac81950cc4c1fe556b00105d 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <stdbool.h>
 
 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
index a89846cae8967336e2fe81c40d9f7036ea9f6b27..193ea092d24fab701e19c1d66e8471107382bd9d 100644 (file)
@@ -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; i<loc_size; ) {
-            if((buzhash_update(&(zck->buzhash), 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;