That makes sense, I've committed r1464413.

Ben Reser <b...@reser.org> writes:

> You should apply the later one.  The check for the kind is redundant.
>
> Just before this check we call svn_fs_base__dag_file_checksum() and
> specify that we want tb->base_checksum->kind.  Ultimately, this calls
> svn_fs_base__rep_contents_checksums() which just does a
> svn_checksum_dup on the checksum in the representation of the kind we
> asked for.  So ultimately, that kind test in the if statement ends up
> testing that our functions are following their contract.
>
> On Wed, Apr 3, 2013 at 2:04 PM, Philip Martin
> <philip.mar...@wandisco.com> wrote:
>> As part of http://subversion.tigris.org/issues/show_bug.cgi?id=4344 I
>> was playing with a BDB repository created by driving the svn_fs API
>> directly in repos-test.c:node_locations2.  This creates a revision where
>> a file has no checksum.  A subsequent commit that modifies the file can
>> SEGV:
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> [Switching to Thread 0x7ff8d49ab700 (LWP 4957)]
>> 0x00007ff8d6430320 in txn_body_apply_textdelta (baton=0x7ff8da368dc0,
>>     trail=0x7ff8da368e60) at ../src/subversion/libsvn_fs_base/tree.c:3733
>> 3733          if (tb->base_checksum->kind == checksum->kind
>>
>> because svn_fs_base__dag_file_checksum returns a NULL checksum as the
>> documentation allows  (repos-test itself doesn't SEGV because it
>> doesn't pass a base checksum, but if you interrupt the test after r2 and
>> then checkout/commit using a standard client the SEGV occurs).
>>
>> I can fix the SEGV using this patch:
>>
>> Index: ../src/subversion/libsvn_fs_base/tree.c
>> ===================================================================
>> --- ../src/subversion/libsvn_fs_base/tree.c     (revision 1464080)
>> +++ ../src/subversion/libsvn_fs_base/tree.c     (working copy)
>> @@ -3730,7 +3730,7 @@
>>           we're calculating both SHA1 and MD5 checksums somewhere in
>>           reps-strings.c.  Could we keep them both around somehow so this
>>           check could be more comprehensive? */
>> -      if (tb->base_checksum->kind == checksum->kind
>> +      if (checksum && tb->base_checksum->kind == checksum->kind
>>              && !svn_checksum_match(tb->base_checksum, checksum))
>>          return svn_checksum_mismatch_err(tb->base_checksum, checksum,
>>                              trail->pool,
>>
>> If I look at the FSFS code it doesn't do the kind comparison, it was
>> removed in r874326 but that's a revert which may have reverted more than
>> intended.  The FSFS code does:
>>
>>       if (!svn_checksum_match(tb->base_checksum, checksum))
>>         return svn_checksum_mismatch_err(tb->base_checksum, checksum, pool,
>>                                          _("Base checksum mismatch on '%s'"),
>>                                          tb->path);
>>
>> so I can also fix the SEGV with:
>>
>> Index: ../src/subversion/libsvn_fs_base/tree.c
>> ===================================================================
>> --- ../src/subversion/libsvn_fs_base/tree.c     (revision 1464080)
>> +++ ../src/subversion/libsvn_fs_base/tree.c     (working copy)
>> @@ -3730,8 +3730,7 @@
>>           we're calculating both SHA1 and MD5 checksums somewhere in
>>           reps-strings.c.  Could we keep them both around somehow so this
>>           check could be more comprehensive? */
>> -      if (tb->base_checksum->kind == checksum->kind
>> -            && !svn_checksum_match(tb->base_checksum, checksum))
>> +      if (!svn_checksum_match(tb->base_checksum, checksum))
>>          return svn_checksum_mismatch_err(tb->base_checksum, checksum,
>>                              trail->pool,
>>                              _("Base checksum mismatch on '%s'"),
>>
>> Which patch should I apply?  Should BDB and FSFS be the same?
>>
>> --
>> Certified & Supported Apache Subversion Downloads:
>> http://www.wandisco.com/subversion/download
>

-- 
Certified & Supported Apache Subversion Downloads:
http://www.wandisco.com/subversion/download

Reply via email to