# HG changeset patch # User Olaf Wintermann # Date 1748622692 -7200 # Node ID d24de29ad1fe9e39ad2d45b1257f36085637d5d7 # Parent 2ecddc5e93f1f3ec0a8f15bc9e302f67bc072387 fix memory management in hashing functions diff -r 2ecddc5e93f1 -r d24de29ad1fe dav/finfo.c --- a/dav/finfo.c Fri May 30 18:21:16 2025 +0200 +++ b/dav/finfo.c Fri May 30 18:31:32 2025 +0200 @@ -263,7 +263,7 @@ xattr->nattr = nattr; unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; - dav_sha256_final(sha256, hash); + dav_sha256_final_free(sha256, hash); xattr->hash = util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); free(attributes); diff -r 2ecddc5e93f1 -r d24de29ad1fe dav/sync.c --- a/dav/sync.c Fri May 30 18:21:16 2025 +0200 +++ b/dav/sync.c Fri May 30 18:31:32 2025 +0200 @@ -4280,7 +4280,7 @@ // set content-hash unsigned char content_hash[DAV_SHA256_DIGEST_LENGTH]; - dav_sha256_final(sha, content_hash); + dav_sha256_final_free(sha, content_hash); sync_set_content_hash(res, content_hash); local->hash = util_hexstr(content_hash, DAV_SHA256_DIGEST_LENGTH); diff -r 2ecddc5e93f1 -r d24de29ad1fe libidav/crypto.c --- a/libidav/crypto.c Fri May 30 18:21:16 2025 +0200 +++ b/libidav/crypto.c Fri May 30 18:31:32 2025 +0200 @@ -858,7 +858,6 @@ void dav_sha256_final(DAV_SHA_CTX *ctx, unsigned char *buf) { CC_SHA256_Final(buf, ctx); - free(ctx); } DavKey* dav_pw2key(const char *password, const unsigned char *salt, int saltlen, int pwfunc, int enc) { @@ -1426,7 +1425,7 @@ DAV_SHA_CTX *ctx = dav_sha256_create(); if(ctx) { dav_sha256_update(ctx, data, len); - dav_sha256_final(ctx, hash); + dav_sha256_final_free(ctx, hash); } return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); } @@ -1452,7 +1451,6 @@ // cleanup cng_cleanup(ctx->hAlg, NULL, ctx->hHash, ctx->pbHashObject); - free(ctx); } DavKey* dav_pw2key(const char *password, const unsigned char *salt, int saltlen, int pwfunc, int enc) { @@ -1518,7 +1516,10 @@ } #endif - +void dav_sha256_final_free(DAV_SHA_CTX *ctx, unsigned char *buf) { + dav_sha256_final(ctx, buf); + free(ctx); +} CxBuffer* aes_encrypt_buffer(CxBuffer *in, DavKey *key) { CxBuffer *encbuf = cxBufferCreate(NULL, in->size, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); diff -r 2ecddc5e93f1 -r d24de29ad1fe libidav/crypto.h --- a/libidav/crypto.h Fri May 30 18:21:16 2025 +0200 +++ b/libidav/crypto.h Fri May 30 18:31:32 2025 +0200 @@ -159,6 +159,7 @@ DAV_SHA_CTX* dav_sha256_create(void); void dav_sha256_update(DAV_SHA_CTX *ctx, const char *data, size_t len); void dav_sha256_final(DAV_SHA_CTX *ctx, unsigned char *buf); +void dav_sha256_final_free(DAV_SHA_CTX *ctx, unsigned char *buf); DavKey* dav_pw2key(const char *password, const unsigned char *salt, int saltlen, int pwfunc, int enc); diff -r 2ecddc5e93f1 -r d24de29ad1fe libidav/resource.c --- a/libidav/resource.c Fri May 30 18:21:16 2025 +0200 +++ b/libidav/resource.c Fri May 30 18:31:32 2025 +0200 @@ -835,7 +835,7 @@ HashStream *s = stream; if(offset == 0 && whence == SEEK_SET) { unsigned char buf[DAV_SHA256_DIGEST_LENGTH]; - dav_sha256_final(s->sha, buf); + dav_sha256_final_free(s->sha, buf); s->sha = NULL; } else { s->error = 1; @@ -938,7 +938,7 @@ data->length); if(hstr.sha) { - dav_sha256_final(hstr.sha, (unsigned char*)data->hash); + dav_sha256_final_free(hstr.sha, (unsigned char*)data->hash); char *hash = util_hexstr((unsigned char*)data->hash, 32); dav_set_string_property_ns(res, DAV_NS, "content-hash", hash); free(hash);