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 2014/03/02 22:30:22 UTC

svn commit: r1573371 - in /subversion/trunk/subversion: libsvn_fs_fs/fs_fs.c libsvn_fs_fs/transaction.c libsvn_fs_fs/verify.c libsvn_subr/checksum.c libsvn_subr/fnv1a.c

Author: stefan2
Date: Sun Mar  2 21:30:21 2014
New Revision: 1573371

URL: http://svn.apache.org/r1573371
Log:
Ensure that the p2l index file format in FSFS is independent of the
machine's endianess.

We handle FNV-1 checksums as integers and shall only use a definitive
byte order in the digest and on disk.  I.e. we must no longer do a
conversion of the result in the checksum function itself.

The on-disk part is handled by the integer stream already (always little
endian) but we used a big endian input before.  Hence, the on-disk
representation changes.  For the digest part, we convert to / from big
endian when writing to the digest / reading from it.

FSX is not affected ATM as it does not use index checksums, yet.

* subversion/libsvn_fs_fs/fs_fs.c
  (write_revision_zero): Update the checksum parts of the rev 0 template.

* subversion/libsvn_subr/fnv1a.c
  (finalize_fnv1a_32x4, 
   svn__fnv1a_32): The checksum value is no longer platform dependent.

* subversion/libsvn_subr/checksum.c
  (svn_checksum,
   svn_checksum_final): Make sure the digest has a definitive, platform
                        independent byte order.

* subversion/libsvn_fs_fs/transaction.c
  (fnv1a_checksum_finalize): Convert from byte ordering used in the
                             digest back to host order.

* subversion/libsvn_fs_fs/verify.c
  (expected_streamed_checksum): Same.

Patch by: philip

Modified:
    subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
    subversion/trunk/subversion/libsvn_fs_fs/transaction.c
    subversion/trunk/subversion/libsvn_fs_fs/verify.c
    subversion/trunk/subversion/libsvn_subr/checksum.c
    subversion/trunk/subversion/libsvn_subr/fnv1a.c

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=1573371&r1=1573370&r2=1573371&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Sun Mar  2 21:30:21 2014
@@ -1274,9 +1274,9 @@ write_revision_zero(svn_fs_t *fs)
                   "\x80\x80\4\1\x1D"    /* 64k pages, 1 page using 29 bytes */
                   "\0"                  /* offset entry 0 page 1 */
                                         /* len, item & type, rev, checksum */
-                  "\x11\x34\0\xe0\xc6\xac\xa9\x07"
-                  "\x59\x09\0\xc0\xfa\xf8\xc5\x04"
-                  "\1\x0d\0\xf2\x95\xbe\xea\x01"
+                  "\x11\x34\0\xf5\xd6\x8c\x81\x06"
+                  "\x59\x09\0\xc8\xfc\xf6\x81\x04"
+                  "\1\x0d\0\x9d\x9e\xa9\x94\x0f" 
                   "\x95\xff\3\x1b\0\0", /* last entry fills up 64k page */
                   38,
                   fs->pool));

Modified: subversion/trunk/subversion/libsvn_fs_fs/transaction.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/transaction.c?rev=1573371&r1=1573370&r2=1573371&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/transaction.c Sun Mar  2 21:30:21 2014
@@ -1765,7 +1765,7 @@ fnv1a_checksum_finalize(apr_uint32_t *di
 
   SVN_ERR(svn_checksum_final(&checksum, context, scratch_pool));
   SVN_ERR_ASSERT(checksum->kind == svn_checksum_fnv1a_32x4);
-  *digest =  *(apr_uint32_t *)(checksum->digest);
+  *digest = ntohl(*(apr_uint32_t *)(checksum->digest));
 
   return SVN_NO_ERROR;
 }

Modified: subversion/trunk/subversion/libsvn_fs_fs/verify.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/verify.c?rev=1573371&r1=1573370&r2=1573371&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/verify.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/verify.c Sun Mar  2 21:30:21 2014
@@ -469,7 +469,7 @@ expected_streamed_checksum(apr_file_t *f
 
   SVN_ERR(svn_checksum_final(&checksum, context, pool));
   SVN_ERR(expected_checksum(file, entry,
-                            *(apr_uint32_t *)checksum->digest,
+                            ntohl(*(apr_uint32_t *)checksum->digest),
                             pool));
 
   return SVN_NO_ERROR;

Modified: subversion/trunk/subversion/libsvn_subr/checksum.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/checksum.c?rev=1573371&r1=1573370&r2=1573371&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/checksum.c (original)
+++ subversion/trunk/subversion/libsvn_subr/checksum.c Sun Mar  2 21:30:21 2014
@@ -21,6 +21,8 @@
  * ====================================================================
  */
 
+#define APR_WANT_BYTEFUNC
+
 #include <ctype.h>
 
 #include <apr_md5.h>
@@ -462,11 +464,13 @@ svn_checksum(svn_checksum_t **checksum,
         break;
 
       case svn_checksum_fnv1a_32:
-        *(apr_uint32_t *)(*checksum)->digest = svn__fnv1a_32(data, len);
+        *(apr_uint32_t *)(*checksum)->digest
+          = htonl(svn__fnv1a_32(data, len));
         break;
 
       case svn_checksum_fnv1a_32x4:
-        *(apr_uint32_t *)(*checksum)->digest = svn__fnv1a_32x4(data, len);
+        *(apr_uint32_t *)(*checksum)->digest
+          = htonl(svn__fnv1a_32x4(data, len));
         break;
 
       default:
@@ -589,12 +593,12 @@ svn_checksum_final(svn_checksum_t **chec
 
       case svn_checksum_fnv1a_32:
         *(apr_uint32_t *)(*checksum)->digest
-          = svn_fnv1a_32__finalize(ctx->apr_ctx);
+          = htonl(svn_fnv1a_32__finalize(ctx->apr_ctx));
         break;
 
       case svn_checksum_fnv1a_32x4:
         *(apr_uint32_t *)(*checksum)->digest
-          = svn_fnv1a_32x4__finalize(ctx->apr_ctx);
+          = htonl(svn_fnv1a_32x4__finalize(ctx->apr_ctx));
         break;
 
       default:

Modified: subversion/trunk/subversion/libsvn_subr/fnv1a.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/fnv1a.c?rev=1573371&r1=1573370&r2=1573371&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/fnv1a.c (original)
+++ subversion/trunk/subversion/libsvn_subr/fnv1a.c Sun Mar  2 21:30:21 2014
@@ -109,15 +109,15 @@ finalize_fnv1a_32x4(apr_uint32_t hashes[
   if (len)
     memcpy(final_data + sizeof(apr_uint32_t) * SCALING, input, len);
 
-  return htonl(fnv1a_32(FNV1_BASE_32,
-                        final_data,
-                        sizeof(apr_uint32_t) * SCALING + len));
+  return fnv1a_32(FNV1_BASE_32,
+                  final_data,
+                  sizeof(apr_uint32_t) * SCALING + len);
 }
 
 apr_uint32_t
 svn__fnv1a_32(const void *input, apr_size_t len)
 {
-  return htonl(fnv1a_32(FNV1_BASE_32, input, len));
+  return fnv1a_32(FNV1_BASE_32, input, len);
 }
 
 apr_uint32_t