On 4. 6. 2026 13:48, Ivan Zhakov wrote:
Hi,

I was reviewing r1931334 nomination and noticed that svn__adler32() uses apr_off_t for buffer size. The apr_off_t stands for an offset in a file. It can be larger or even smaller than maximum addressable size (apr_size_t).


The diff code uses off_t because it deals with file sizes. The svn_adler32 wrapper probably inherited that. According to POSIX.1 [1] there is no way that off_t can be smaller than size_t but it can certainly be larger. It's perfectly normal to have a system with 32-bit size_t and 64-bit off_t, so in that respect, your proposed change is a regression.

The other major change here is that off_t is signed but size_t is unsigned.

Taken together, the patch looks OK but -1 to the concept. I do not see any improvement. The assumption that's the motivation for the patch, that off_t can be smaller than size_t, is incorrect.

-- Brane


I have prepared patch that fixes this. Patch changes the diff code which very complicated, so review will be much appreciated.

Log message:
[[[
Use apr_size_t instead of apr_off_t for buffer size in svn__adler32().

The apr_off_t stands for an offset in a file. It can be larger or even smaller
than maximum addressable size (apr_size_t).

Update all callers.

* subversion/include/private/svn_adler32.h
* subversion/libsvn_subr/adler32.c
  (svn__adler32): Use apr_size_t instead of apr_off_t for SIZE argument.

* subversion/libsvn_diff/diff.h
* subversion/libsvn_diff/util.c
  (svn_diff__normalize_buffer): Use apr_size_t instead of apr_off_t for
   LENGTGP argument.

LENGTHP?


* subversion/libsvn_diff/diff_file.c
  (datasource_get_next_token): Use apr_size_t instead of apr_off_t for
   local variable LENGTH.
  (token_compare): Rewrite a code a bit to make it clear that size is
   apr_size_t.

* subversion/libsvn_diff/diff_memory.c
  (datasource_get_next_token, token_compare): Use apr_size_t instead of
   apr_off_t for local variables to match source type.
]]]


Looking at the patch itself:

I don't see the need to complicate things by introducing a 'read_length' variable in subversion/libsvn_diff/diff_file.c. It's not really an optimisation and to my eyes it makes the code less clear, not more.

-- Brane

[1] see attached image.

Reply via email to