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

Reply via email to