On Mon, Jan 12, 2026 at 1:22 PM Branko Čibej <[email protected]> wrote:
> On 12. 1. 26 12:52, [email protected] wrote: > > Author: brane > Date: Mon Jan 12 11:52:07 2026 > New Revision: 1931262 > > Log: > Fix warnings in the new checksum code. > > * subversion/libsvn_subr/checksum.c > (svn_checksum): Remove unused variable. > * subversion/libsvn_subr/checksum_apr.c: Include <limits.h>. > (svn_checksum__sha1, svn_checksum__sha1_ctx_update): Do not blindly cast > or implicitly narrow the data length. Check the limits first. > > Modified: > subversion/trunk/subversion/libsvn_subr/checksum.c > subversion/trunk/subversion/libsvn_subr/checksum_apr.c > > Modified: subversion/trunk/subversion/libsvn_subr/checksum.c > ============================================================================== > --- subversion/trunk/subversion/libsvn_subr/checksum.c Mon Jan 12 > 11:51:21 2026 (r1931261) > +++ subversion/trunk/subversion/libsvn_subr/checksum.c Mon Jan 12 > 11:52:07 2026 (r1931262) > @@ -475,8 +475,6 @@ svn_checksum(svn_checksum_t **checksum, > apr_size_t len, > apr_pool_t *pool) > { > - apr_sha1_ctx_t sha1_ctx; > - > SVN_ERR(validate_kind(kind)); > *checksum = svn_checksum_create(kind, pool); > > > Modified: subversion/trunk/subversion/libsvn_subr/checksum_apr.c > ============================================================================== > --- subversion/trunk/subversion/libsvn_subr/checksum_apr.c Mon Jan 12 > 11:51:21 2026 (r1931261) > +++ subversion/trunk/subversion/libsvn_subr/checksum_apr.c Mon Jan 12 > 11:52:07 2026 (r1931262) > @@ -21,6 +21,8 @@ > * ==================================================================== > */ > > +#include <limits.h> > + > #include "svn_private_config.h" > #ifdef SVN_CHECKSUM_BACKEND_APR > > @@ -89,6 +91,10 @@ svn_checksum__sha1(unsigned char *digest > apr_size_t len) > { > apr_sha1_ctx_t sha1_ctx; > + > + /* Do not blindly truncate the data length. */ > + SVN_ERR_ASSERT(len < UINT_MAX); > + > apr_sha1_init(&sha1_ctx); > apr_sha1_update(&sha1_ctx, data, (unsigned int)len); > apr_sha1_final(digest, &sha1_ctx); > @@ -121,7 +127,9 @@ svn_checksum__sha1_ctx_update(svn_checks > const void *data, > apr_size_t len) > { > - apr_sha1_update(&ctx->apr_ctx, data, len); > + /* Do not blindly truncate the data length. */ > + SVN_ERR_ASSERT(len < UINT_MAX); > + apr_sha1_update(&ctx->apr_ctx, data, (unsigned int)len); > return SVN_NO_ERROR; > } > > > Just a quick note, it's generally not a good idea to use unchecked > typecasts anywhere. In this case there was a borderline chance of > Subversion quietly computing invalid hashes. The assert at least removes > the "quiet" part, although I suspect the better solution is to call > apr_sha1_update in UINT_MAX-sized chunks until all data are consumed. > I agree. It would be great if APR was accepting size as size_t. But it's not a big deal. Anyways, I'm pretty sure the issue existed there before. Maybe this function could feed it blocks of UINT_MAX if it exceeds the limit. But I don't think we should bother to support such edge cases, because if it happens, the issue is on the caller side -- it should not allocate 4GB buffers in memory. > There is potentially a similar problem in checksum_bcrypt.c, where there > are typecasts to ULONG. Now, currently apr_size_t and ULONG are the same on > both 32- and 64-bit Windows ... until they aren't, and no-one is going to > see the problem because the Windows build is plagued with warnings and new > ones will just get lost in the noise. > > -- Brane > > -- Timofei Zhakov

