You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2015/08/24 15:44:29 UTC

svn commit: r1697393 - /subversion/trunk/subversion/libsvn_fs_fs/load-index.c

Author: stefan2
Date: Mon Aug 24 13:44:28 2015
New Revision: 1697393

URL: http://svn.apache.org/r1697393
Log:
Improve error checking in 'svnfsfs load-index'.  The input data must
have no holes or overlaps in it.

* subversion/libsvn_fs_fs/load-index.c
  (check_all_covered): New validation function.
  (svn_fs_fs__load_index): Invoke the new check.

Modified:
    subversion/trunk/subversion/libsvn_fs_fs/load-index.c

Modified: subversion/trunk/subversion/libsvn_fs_fs/load-index.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/load-index.c?rev=1697393&r1=1697392&r2=1697393&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/load-index.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/load-index.c Mon Aug 24 13:44:28 2015
@@ -29,6 +29,39 @@
 #include "util.h"
 #include "transaction.h"
 
+/* Make sure that the svn_fs_fs__p2l_entry_t* in ENTRIES are consecutive
+ * and non-overlapping.  Use SCRATCH_POOL for temporaries. */
+static svn_error_t *
+check_all_covered(apr_array_header_t *entries,
+                  apr_pool_t *scratch_pool)
+{
+  int i;
+  apr_off_t expected = 0;
+  for (i = 0; i < entries->nelts; ++i)
+    {
+      const svn_fs_fs__p2l_entry_t *entry
+        = APR_ARRAY_IDX(entries, i, const svn_fs_fs__p2l_entry_t *);
+
+      if (entry->offset < expected)
+        return svn_error_createf(SVN_ERR_INVALID_INPUT, NULL,
+                                 "Overlapping index data for offset %s",
+                                 apr_psprintf(scratch_pool,
+                                              "%" APR_UINT64_T_HEX_FMT,
+                                              (apr_uint64_t)expected));
+
+      if (entry->offset > expected)
+        return svn_error_createf(SVN_ERR_INVALID_INPUT, NULL,
+                                 "Missing index data for offset %s",
+                                 apr_psprintf(scratch_pool,
+                                              "%" APR_UINT64_T_HEX_FMT,
+                                              (apr_uint64_t)expected));
+
+      expected = entry->offset + entry->size;
+    }
+
+  return SVN_NO_ERROR;
+}
+
 /* A svn_sort__array compatible comparator function, sorting the
  * svn_fs_fs__p2l_entry_t** given in LHS, RHS by offset. */
 static int
@@ -69,6 +102,9 @@ svn_fs_fs__load_index(svn_fs_t *fs,
       const char *p2l_proto_index;
       svn_fs_fs__revision_file_t *rev_file;
 
+      /* Ensure that the index data is complete. */
+      SVN_ERR(check_all_covered(entries, scratch_pool));
+
       /* Open rev / pack file & trim indexes + footer off it. */
       SVN_ERR(svn_fs_fs__open_pack_or_rev_file_writable(&rev_file, fs,
                                                         revision, iterpool,