On 13.01.2015 19:59, Ben Reser wrote: > On 10/13/14 3:54 PM, stef...@apache.org wrote: >> Author: stefan2 >> Date: Mon Oct 13 22:54:13 2014 >> New Revision: 1631598 >> >> URL: http://svn.apache.org/r1631598 >> Log: >> Add FSFS index checksum verification code to 'svnadmin verify'. >> >> We don't verify the index data against the checksums on every >> access as there is plenty of cross-verification within the indexes, >> between them as well as between index and rev data. Only if some >> inconsistency has been detected and the user wants to trace down >> the source (using 'svnadmin verify'), will we verify that the index >> data has not been tampered with. >> >> * subversion/libsvn_fs_fs/verify.c >> (verify_index_checksum, >> verify_index_checksums): New per rev / pack file verification code. >> (verify_index_consistency): Call the new index checksum test before >> using any of the index contents. >> >> * subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c >> (fuzzing_1_byte_1_rev): Remove the code that would accept certain >> index modifications. Accept only case changes >> in index MD5 digests because they don't affect >> the validity. > [snip] > >> @@ -144,14 +120,30 @@ fuzzing_1_byte_1_rev(const char *repo_na >> err = svn_repos_verify_fs3(repos, revision, revision, TRUE, FALSE, >> FALSE, >> NULL, NULL, NULL, NULL, iterpool); >> >> - /* Benign changes may or may not be detected. */ >> - if (!is_legal) >> + /* Case-only changes in checksum digests are not an error. >> + * We allow upper case chars to be used in MD5 checksums in all other >> + * places, thus restricting them here would be inconsistent. */ >> + if ( i >= filesize - footer_len /* Within footer */ >> + && c_old >= 'a' && c_old <= 'f' /* 'a' to 'f', only appear >> + in checksum digests */ >> + && c_new == c_old - 'a' + 'A') /* respective upper case */ >> + { >> + if (err) >> + { >> + /* Let us know where we were too strict ... */ >> + printf("Detected case change in checksum digest at offset 0x%" >> + APR_UINT64_T_HEX_FMT " (%" APR_OFF_T_FMT ") in r%ld: " >> + "%c -> %c\n", i, i, revision, c_old, c_new); >> + >> + SVN_ERR(err); >> + } >> + } >> + else if (!err) >> { >> /* Let us know where we miss changes ... */ >> - if (!err) >> - printf("Undetected mod at offset %"APR_UINT64_T_HEX_FMT >> - " (%"APR_OFF_T_FMT") in r%ld: 0x%02x -> 0x%02x\n", >> - i, i, revision, c_old, c_new); >> + printf("Undetected mod at offset 0x%"APR_UINT64_T_HEX_FMT >> + " (%"APR_OFF_T_FMT") in r%ld: 0x%02x -> 0x%02x\n", >> + i, i, revision, c_old, c_new); >> >> SVN_TEST_ASSERT(err); >> } >> >> > Those printf formats aren't valid on all platforms/builds of APR. In this > case > i is an apr_off_t and you're using APR_UINT64_T_HEX_FMT with it. > Unfortunately > you can't guarantee that apr_off_t is a 64-bit int. If LFS support isn't > enabled and the platform has its own off_t then APR will use whatever the size > is for that, or just an int if off_t isn't defined. See aprenv.py in APR's > source code for the various scenarios. > > Not sure what you want to do about this since it makes the hex output more > difficult to do. I'd probably just remove the hex output since it's a test > and > we can probably deal with that bit of convenience.
Since it is a test, what's wrong with just casting the first vararg to (apr_uint64_t) instead, since we "know" (i.e., hope) that off_t won't overflow 64 bits ... -- Brane