Author: rinrab
Date: Sun Mar 15 18:50:57 2026
New Revision: 1932307

Log:
Implement properly-sized updates when computing contextless checksum via
Windows BCrypt. 

* subversion/libsvn_subr/checksum_bcrypt.c
  (bcrypt_checksum): Update declaration so the function requires a char*
   instead of void* and add a loop to process as blocks of ULONG_MAX. Note: we
   cannot use already existing bcrypt_ctx_update because we don't have
   a bcrypt_ctx_t in this context - this just a different nature where all
   allocation should be done on stack.

Modified:
   subversion/trunk/subversion/libsvn_subr/checksum_bcrypt.c

Modified: subversion/trunk/subversion/libsvn_subr/checksum_bcrypt.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/checksum_bcrypt.c   Sun Mar 15 
18:45:02 2026        (r1932306)
+++ subversion/trunk/subversion/libsvn_subr/checksum_bcrypt.c   Sun Mar 15 
18:50:57 2026        (r1932307)
@@ -172,14 +172,12 @@ bcrypt_ctx_reset(algorithm_state_t *algo
 static svn_error_t *
 bcrypt_checksum(algorithm_state_t *algorithm,
                 unsigned char *digest,
-                const void *data,
+                const char *data,
                 apr_size_t len)
 {
   BCRYPT_HANDLE handle;
   void *object_buf;
 
-  SVN_ERR_ASSERT(len <= ULONG_MAX);
-
   SVN_ERR(svn_atomic__init_once(&algorithm->initialized, algorithm_init,
                                 algorithm, NULL));
 
@@ -193,10 +191,22 @@ bcrypt_checksum(algorithm_state_t *algor
                                         /* cbSecret */ 0,
                                         /* dwFlags */ 0)));
 
-  SVN_ERR(handle_error(BCryptHashData(handle,
-                                      (PUCHAR) data,
-                                      (ULONG) len,
-                                      /* dwFlags */ 0)));
+  while (len > 0)
+    {
+      ULONG block;
+
+      if (len < ULONG_MAX)
+        block = (ULONG)len;
+      else
+        block = UINT_MAX;
+
+      SVN_ERR(handle_error(BCryptHashData(handle,
+                                          (PUCHAR) data, block,
+                                          /* dwFlags */ 0)));
+
+      len -= block;
+      data += block;
+    }
 
   SVN_ERR(handle_error(BCryptFinishHash(handle,
                                         (PUCHAR) digest,

Reply via email to