On 11 June 2015 at 14:02, Daniel Shahaf <d...@daniel.shahaf.name> wrote:
> i...@apache.org wrote on Sun, Jun 07, 2015 at 17:07:30 -0000:
>> Author: ivan
>> Date: Sun Jun  7 17:07:30 2015
>> New Revision: 1684047
>>
>> URL: http://svn.apache.org/r1684047
>> Log:
>> Avoid callers of svn__compress() and svn__decompress() construct fake
>> svn_stringbuf_t instance.
>>
[...]

Hi Daniel,

Thanks for review!

>>        svn_stringbuf_t *compressed = svn_stringbuf_create_empty(pool);
>> -      svn_stringbuf_t *original = svn_stringbuf_create_empty(pool);
>> -      original->data = (char *)window->new_data->data; /* won't be modified 
>> */
>> -      original->len = window->new_data->len;
>> -      original->blocksize = window->new_data->len + 1;
>>
>> -      SVN_ERR(svn__compress(original, compressed, eb->compression_level));
>> +      SVN_ERR(svn__compress(window->new_data->data, window->new_data->len,
>> +                            compressed, eb->compression_level));
>
> This change introduces the possibility of bugs of the form:
>
>     svn_error_t *foo(svn_stringbuf_t *bar, svn_string_t *baz) {
>         svn_compress(bar->data, baz->len, ...); /* should be bar->len */
>     }
>
> i.e., "bar" and "baz" instead of "bar" and "bar".
>
> I suppose having a svn_string_t formal parameter is an alternative.
>
> It's just a minor issue, of course.
>
I was thinking about adding svn__compress_stringbuf() wrapper around
svn__compress(), but then decided that it doesn't worth efforts given
that svn__compress() used with stringbuf in just few places.

Using svn_string_t is not useful also, because data referenced by
svn_string_t->data must be NUL terminated, which is inconvenient for
callers in some cases. Like stream parser. The old code was passing
incorrect stringbuf_t:
[[[
-static svn_error_t *
-zlib_decode(const unsigned char *in, apr_size_t inLen, svn_stringbuf_t *out,
-            apr_size_t limit)
-{
-  /* construct a fake string buffer as parameter to svn__decompress.
-     This is fine as that function never writes to it. */
-  svn_stringbuf_t compressed;
-  compressed.pool = NULL;
-  compressed.data = (char *)in;
-  compressed.len = inLen;
-  compressed.blocksize = inLen + 1;
-
-  return svn__decompress(&compressed, out, limit);
-}
]]]

What could be useful svn__decompress_stringbuf() with semantic to
decompress buffer in-place. This often happens when FSFS/FSX
decompress revprops that are not compresed by default.

-- 
Ivan Zhakov

Reply via email to