Author: rinrab
Date: Tue Dec 30 17:23:05 2025
New Revision: 1930987

Log:
Bound checksum contexts of APR and OpenSSL into redeclared
svn_checksum__md5_ctx_t and svn_checksum__sha1_ctx_t structures to prevent
casting contexts.

This should not change the layout as they are stored in memory.

* subversion/libsvn_subr/checksum_apr.c
* subversion/libsvn_subr/checksum_openssl.c
  (svn_checksum__md5_ctx_t, svn_checksum__sha1_ctx_t): Declare structs.

  (svn_checksum__md5_ctx_create, svn_checksum__sha1_ctx_create): Allocate
   contexts directly and remove cast.

  (svn_checksum__md5_ctx_reset, svn_checksum__md5_ctx_update,
   svn_checksum__md5_ctx_final, svn_checksum__sha1_ctx_reset,
   svn_checksum__sha1_ctx_update, svn_checksum__sha1_ctx_final): Take
   implementation-specific context from a field as a reference.

Modified:
   subversion/trunk/subversion/libsvn_subr/checksum_apr.c
   subversion/trunk/subversion/libsvn_subr/checksum_openssl.c

Modified: subversion/trunk/subversion/libsvn_subr/checksum_apr.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/checksum_apr.c      Tue Dec 30 
17:03:47 2025        (r1930986)
+++ subversion/trunk/subversion/libsvn_subr/checksum_apr.c      Tue Dec 30 
17:23:05 2025        (r1930987)
@@ -43,20 +43,24 @@ svn_checksum__md5(unsigned char *digest,
   return SVN_NO_ERROR;
 }
 
+struct svn_checksum__md5_ctx_t
+{
+  apr_md5_ctx_t apr_ctx;
+};
+
 svn_checksum__md5_ctx_t *
 svn_checksum__md5_ctx_create(apr_pool_t *pool)
 {
-  apr_md5_ctx_t *result = apr_palloc(pool, sizeof(*result));
-  apr_md5_init(result);
-  return (svn_checksum__md5_ctx_t *)result;
+  svn_checksum__md5_ctx_t *result = apr_palloc(pool, sizeof(*result));
+  apr_md5_init(&result->apr_ctx);
+  return result;
 }
 
 svn_error_t *
 svn_checksum__md5_ctx_reset(svn_checksum__md5_ctx_t *ctx)
 {
-  apr_md5_ctx_t *apr_ctx = (apr_md5_ctx_t *)ctx;
-  memset(apr_ctx, 0, sizeof(*apr_ctx));
-  apr_md5_init(apr_ctx);
+  memset(ctx, 0, sizeof(*ctx));
+  apr_md5_init(&ctx->apr_ctx);
   return SVN_NO_ERROR;
 }
 
@@ -65,8 +69,7 @@ svn_checksum__md5_ctx_update(svn_checksu
                              const void *data,
                              apr_size_t len)
 {
-  apr_md5_ctx_t *apr_ctx = (apr_md5_ctx_t *)ctx;
-  apr_md5_update(apr_ctx, data, len);
+  apr_md5_update(&ctx->apr_ctx, data, len);
   return SVN_NO_ERROR;
 }
 
@@ -74,9 +77,7 @@ svn_error_t *
 svn_checksum__md5_ctx_final(unsigned char *digest,
                             svn_checksum__md5_ctx_t *ctx)
 {
-
-  apr_md5_ctx_t *apr_ctx = (apr_md5_ctx_t *)ctx;
-  apr_md5_final(digest, apr_ctx);
+  apr_md5_final(digest, &ctx->apr_ctx);
   return SVN_NO_ERROR;
 }
 
@@ -94,20 +95,24 @@ svn_checksum__sha1(unsigned char *digest
   return SVN_NO_ERROR;
 }
 
+struct svn_checksum__sha1_ctx_t
+{
+  apr_sha1_ctx_t apr_ctx;
+};
+
 svn_checksum__sha1_ctx_t *
 svn_checksum__sha1_ctx_create(apr_pool_t *pool)
 {
-  apr_sha1_ctx_t *result = apr_palloc(pool, sizeof(*result));
-  apr_sha1_init(result);
+  svn_checksum__sha1_ctx_t *result = apr_palloc(pool, sizeof(*result));
+  apr_sha1_init(&result->apr_ctx);
   return (svn_checksum__sha1_ctx_t *)result;
 }
 
 svn_error_t *
 svn_checksum__sha1_ctx_reset(svn_checksum__sha1_ctx_t *ctx)
 {
-  apr_sha1_ctx_t *apr_ctx = (apr_sha1_ctx_t *)ctx;
-  memset(apr_ctx, 0, sizeof(*apr_ctx));
-  apr_sha1_init(apr_ctx);
+  memset(ctx, 0, sizeof(*ctx));
+  apr_sha1_init(&ctx->apr_ctx);
   return SVN_NO_ERROR;
 }
 
@@ -116,8 +121,7 @@ svn_checksum__sha1_ctx_update(svn_checks
                               const void *data,
                               apr_size_t len)
 {
-  apr_sha1_ctx_t *apr_ctx = (apr_sha1_ctx_t *)ctx;
-  apr_sha1_update(apr_ctx, data, len);
+  apr_sha1_update(&ctx->apr_ctx, data, len);
   return SVN_NO_ERROR;
 }
 
@@ -126,8 +130,7 @@ svn_checksum__sha1_ctx_final(unsigned ch
                              svn_checksum__sha1_ctx_t *ctx)
 {
 
-  apr_sha1_ctx_t *apr_ctx = (apr_sha1_ctx_t *)ctx;
-  apr_sha1_final(digest, apr_ctx);
+  apr_sha1_final(digest, &ctx->apr_ctx);
   return SVN_NO_ERROR;
 }
 

Modified: subversion/trunk/subversion/libsvn_subr/checksum_openssl.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/checksum_openssl.c  Tue Dec 30 
17:03:47 2025        (r1930986)
+++ subversion/trunk/subversion/libsvn_subr/checksum_openssl.c  Tue Dec 30 
17:23:05 2025        (r1930987)
@@ -66,20 +66,24 @@ svn_checksum__md5(unsigned char *digest,
   return SVN_NO_ERROR;
 }
 
+struct svn_checksum__md5_ctx_t
+{
+  MD5_CTX md5_ctx;
+};
+
 svn_checksum__md5_ctx_t *
 svn_checksum__md5_ctx_create(apr_pool_t *pool)
 {
-  MD5_CTX *result = apr_palloc(pool, sizeof(*result));
-  MD5_Init(result);
-  return (svn_checksum__md5_ctx_t *)result;
+  svn_checksum__md5_ctx_t *result = apr_palloc(pool, sizeof(*result));
+  MD5_Init(&result->md5_ctx);
+  return result;
 }
 
 svn_error_t *
 svn_checksum__md5_ctx_reset(svn_checksum__md5_ctx_t *ctx)
 {
-  MD5_CTX *md5_ctx = (MD5_CTX *)ctx;
-  memset(md5_ctx, 0, sizeof(*md5_ctx));
-  MD5_Init(md5_ctx);
+  memset(ctx, 0, sizeof(*ctx));
+  MD5_Init(&ctx->md5_ctx);
   return SVN_NO_ERROR;
 }
 
@@ -88,8 +92,7 @@ svn_checksum__md5_ctx_update(svn_checksu
                              const void *data,
                              apr_size_t len)
 {
-  MD5_CTX *md5_ctx = (MD5_CTX *)ctx;
-  MD5_Update(md5_ctx, data, len);
+  MD5_Update(&ctx->md5_ctx, data, len);
   return SVN_NO_ERROR;
 }
 
@@ -97,8 +100,7 @@ svn_error_t *
 svn_checksum__md5_ctx_final(unsigned char *digest,
                             svn_checksum__md5_ctx_t *ctx)
 {
-  MD5_CTX *md5_ctx = (MD5_CTX *)ctx;
-  MD5_Final(digest, md5_ctx);
+  MD5_Final(digest, &ctx->md5_ctx);
   return SVN_NO_ERROR;
 }
 
@@ -118,20 +120,24 @@ svn_checksum__sha1(unsigned char *digest
   return SVN_NO_ERROR;
 }
 
+struct svn_checksum__sha1_ctx_t
+{
+  SHA_CTX sha_ctx;
+};
+
 svn_checksum__sha1_ctx_t *
 svn_checksum__sha1_ctx_create(apr_pool_t *pool)
 {
-  SHA_CTX *result = apr_palloc(pool, sizeof(*result));
-  SHA1_Init(result);
-  return (svn_checksum__sha1_ctx_t *)result;
+  svn_checksum__sha1_ctx_t *result = apr_palloc(pool, sizeof(*result));
+  SHA1_Init(&result->sha_ctx);
+  return result;
 }
 
 svn_error_t *
 svn_checksum__sha1_ctx_reset(svn_checksum__sha1_ctx_t *ctx)
 {
-  SHA_CTX *sha_ctx = (SHA_CTX *)ctx;
-  memset(sha_ctx, 0, sizeof(*sha_ctx));
-  SHA1_Init(sha_ctx);
+  memset(ctx, 0, sizeof(*ctx));
+  SHA1_Init(&ctx->sha_ctx);
   return SVN_NO_ERROR;
 }
 
@@ -140,8 +146,7 @@ svn_checksum__sha1_ctx_update(svn_checks
                               const void *data,
                               apr_size_t len)
 {
-  SHA_CTX *sha_ctx = (SHA_CTX *)ctx;
-  SHA1_Update(sha_ctx, data, len);
+  SHA1_Update(&ctx->sha_ctx, data, len);
   return SVN_NO_ERROR;
 }
 
@@ -150,8 +155,7 @@ svn_checksum__sha1_ctx_final(unsigned ch
                              svn_checksum__sha1_ctx_t *ctx)
 {
 
-  SHA_CTX *sha_ctx = (SHA_CTX *)ctx;
-  SHA1_Final(digest, sha_ctx);
+  SHA1_Final(digest, &ctx->sha_ctx);
   return SVN_NO_ERROR;
 }
 

Reply via email to