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 2012/10/15 20:01:21 UTC
svn commit: r1398425 - /subversion/trunk/tools/server-side/fsfs-reorg.c
Author: stefan2
Date: Mon Oct 15 18:01:21 2012
New Revision: 1398425
URL: http://svn.apache.org/viewvc?rev=1398425&view=rev
Log:
In fsfs-reorg, address int64 -> size_t conversion warnings in 32 bit builds.
This limits all file sizes and offsets to 4 GB under 32 bits. Larger values
cause svn_error_t* to be returned.
* tools/server-side/fsfs-reorg.c
(fragment_t,
revision_location_t,
location_t,
representation_t,
dir_cache_entry_t,
window_cache_entry_t): store offsets and sizes as size_t in data structs
(get_content): limit file size to APR_SIZE_MAX
(get_dir_cache_index,
get_cached_dir,
set_cached_dir,
get_window_cache_index,
get_cached_window,
set_cached_window,
compare_noderev_offsets,
find_noderev,
parse_pred,
compare_representation_offsets,
find_representation,
read_windows,
read_plain,
read_noderev,
get_noderev,
parse_dir,
read_pack_file,
read_revision_file): replace all apr_int64_t with apr_size_t
(read_manifest,
read_revision_header,
parse_revnode_pos,
read_rep_base,
parse_representation,
main): ditto + limit parsed offsets to APR_SIZE_MAX
Modified:
subversion/trunk/tools/server-side/fsfs-reorg.c
Modified: subversion/trunk/tools/server-side/fsfs-reorg.c
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/server-side/fsfs-reorg.c?rev=1398425&r1=1398424&r2=1398425&view=diff
==============================================================================
--- subversion/trunk/tools/server-side/fsfs-reorg.c (original)
+++ subversion/trunk/tools/server-side/fsfs-reorg.c Mon Oct 15 18:01:21 2012
@@ -61,23 +61,23 @@ enum fragment_kind_t
typedef struct fragment_t
{
- apr_int64_t position;
+ apr_size_t position;
void *data;
enum fragment_kind_t kind;
} fragment_t;
typedef struct revision_location_t
{
- apr_int64_t offset;
- apr_int64_t changes;
- apr_int64_t changes_len;
- apr_int64_t end;
+ apr_size_t offset;
+ apr_size_t changes;
+ apr_size_t changes_len;
+ apr_size_t end;
} revision_location_t;
typedef struct location_t
{
- apr_int64_t offset;
- apr_int64_t size;
+ apr_size_t offset;
+ apr_size_t size;
} location_t;
typedef struct direntry_t
@@ -98,7 +98,7 @@ typedef struct representation_t
{
location_t original;
location_t target;
- apr_int64_t header_size;
+ apr_size_t header_size;
struct representation_t *delta_base;
revision_info_t *revision;
directory_t *dir;
@@ -153,7 +153,7 @@ typedef struct content_cache_t
typedef struct dir_cache_entry_t
{
svn_revnum_t revision;
- apr_int64_t offset;
+ apr_size_t offset;
apr_hash_t *hash;
} dir_cache_entry_t;
@@ -171,7 +171,7 @@ typedef struct dir_cache_t
typedef struct window_cache_entry_t
{
svn_revnum_t revision;
- apr_int64_t offset;
+ apr_size_t offset;
svn_stringbuf_t *window;
} window_cache_entry_t;
@@ -342,10 +342,11 @@ get_content(svn_string_t **data,
temp->len = revision_info->original.end - revision_info->original.offset;
SVN_ERR(open_rev_or_pack_file(&file, fs, revision, scratch_pool));
- temp_offset = (apr_off_t)revision_info->original.offset;
+ temp_offset = revision_info->original.offset;
SVN_ERR(svn_io_file_seek(file, APR_SET, &temp_offset,
scratch_pool));
- revision_info->original.offset = temp_offset;
+ SVN_ERR_ASSERT(temp_offset < APR_SIZE_MAX);
+ revision_info->original.offset = (apr_size_t)temp_offset;
SVN_ERR(svn_io_file_read(file, temp->data, &temp->len, scratch_pool));
set_cached_content(fs->cache, revision,
@@ -373,7 +374,7 @@ create_dir_cache(apr_pool_t *pool,
static apr_size_t
get_dir_cache_index(fs_fs_t *fs,
svn_revnum_t revision,
- apr_int64_t offset)
+ apr_size_t offset)
{
return (revision + offset * 0xd1f3da69) % fs->dir_cache->entry_count;
}
@@ -389,7 +390,7 @@ get_cached_dir(fs_fs_t *fs,
representation_t *representation)
{
svn_revnum_t revision = representation->revision->revision;
- apr_int64_t offset = representation->original.offset;
+ apr_size_t offset = representation->original.offset;
apr_size_t i = get_dir_cache_index(fs, revision, offset);
dir_cache_entry_t *entry = &fs->dir_cache->entries[i];
@@ -405,7 +406,7 @@ set_cached_dir(fs_fs_t *fs,
apr_hash_t *hash)
{
svn_revnum_t revision = representation->revision->revision;
- apr_int64_t offset = representation->original.offset;
+ apr_size_t offset = representation->original.offset;
apr_size_t i = get_dir_cache_index(fs, revision, offset);
dir_cache_entry_t *entry = &fs->dir_cache->entries[i];
@@ -450,7 +451,7 @@ create_window_cache(apr_pool_t *pool,
static apr_size_t
get_window_cache_index(fs_fs_t *fs,
svn_revnum_t revision,
- apr_int64_t offset)
+ apr_size_t offset)
{
return (revision + offset * 0xd1f3da69) % fs->window_cache->entry_count;
}
@@ -461,7 +462,7 @@ get_cached_window(fs_fs_t *fs,
apr_pool_t *pool)
{
svn_revnum_t revision = representation->revision->revision;
- apr_int64_t offset = representation->original.offset;
+ apr_size_t offset = representation->original.offset;
apr_size_t i = get_window_cache_index(fs, revision, offset);
window_cache_entry_t *entry = &fs->window_cache->entries[i];
@@ -477,7 +478,7 @@ set_cached_window(fs_fs_t *fs,
svn_stringbuf_t *window)
{
svn_revnum_t revision = representation->revision->revision;
- apr_int64_t offset = representation->original.offset;
+ apr_size_t offset = representation->original.offset;
apr_size_t i = get_window_cache_index(fs, revision, offset);
window_cache_entry_t *entry = &fs->window_cache->entries[i];
@@ -516,12 +517,12 @@ read_manifest(apr_array_header_t **manif
/* While we're here, let's just read the entire manifest file into an array,
so we can cache the entire thing. */
iterpool = svn_pool_create(pool);
- *manifest = apr_array_make(pool, fs->max_files_per_dir, sizeof(apr_int64_t));
+ *manifest = apr_array_make(pool, fs->max_files_per_dir, sizeof(apr_size_t));
while (1)
{
svn_stringbuf_t *sb;
svn_boolean_t eof;
- apr_int64_t val;
+ apr_uint64_t val;
svn_error_t *err;
svn_pool_clear(iterpool);
@@ -529,12 +530,12 @@ read_manifest(apr_array_header_t **manif
if (eof)
break;
- err = svn_cstring_atoi64(&val, sb->data);
+ err = svn_cstring_strtoui64(&val, sb->data, 0, APR_SIZE_MAX, 10);
if (err)
return svn_error_createf(SVN_ERR_FS_CORRUPT, err,
_("Manifest offset '%s' too large"),
sb->data);
- APR_ARRAY_PUSH(*manifest, apr_int64_t) = (apr_int64_t)val;
+ APR_ARRAY_PUSH(*manifest, apr_size_t) = (apr_size_t)val;
}
svn_pool_destroy(iterpool);
@@ -542,18 +543,18 @@ read_manifest(apr_array_header_t **manif
}
static svn_error_t *
-read_revision_header(apr_int64_t *changes,
- apr_int64_t *changes_len,
- apr_int64_t *root_noderev,
+read_revision_header(apr_size_t *changes,
+ apr_size_t *changes_len,
+ apr_size_t *root_noderev,
svn_stringbuf_t *file_content,
- apr_int64_t start,
- apr_int64_t end,
+ apr_size_t start,
+ apr_size_t end,
apr_pool_t *pool)
{
char buf[64];
const char *line;
const char *space;
- apr_int64_t val;
+ apr_uint64_t val;
apr_size_t len;
/* Read in this last block, from which we will identify the last line. */
@@ -583,10 +584,10 @@ read_revision_header(apr_int64_t *change
*(char *)space = 0;
- SVN_ERR(svn_cstring_atoi64(&val, line+1));
- *root_noderev = (apr_int64_t)val;
- SVN_ERR(svn_cstring_atoi64(&val, space+1));
- *changes = (apr_int64_t)val;
+ SVN_ERR(svn_cstring_strtoui64(&val, line+1, 0, APR_SIZE_MAX, 10));
+ *root_noderev = (apr_size_t)val;
+ SVN_ERR(svn_cstring_strtoui64(&val, space+1, 0, APR_SIZE_MAX, 10));
+ *changes = (apr_size_t)val;
*changes_len = end - *changes - start - (buf + len - line) + 1;
return SVN_NO_ERROR;
@@ -723,16 +724,17 @@ static int
compare_noderev_offsets(const void *data, const void *key)
{
return (*(const noderev_t **)data)->original.offset
- - *(const apr_int64_t *)key;
+ - *(const apr_size_t *)key;
}
static svn_error_t *
parse_revnode_pos(revision_info_t **revision_info,
- apr_int64_t *offset,
+ apr_size_t *offset,
fs_fs_t *fs,
svn_string_t *id)
{
int revision;
+ apr_uint64_t temp;
const char *revision_pos = strrchr(id->data, 'r');
char *offset_pos = (char *)strchr(id->data, '/');
@@ -743,7 +745,8 @@ parse_revnode_pos(revision_info_t **revi
*offset_pos = 0;
SVN_ERR(svn_cstring_atoi(&revision, revision_pos + 1));
- SVN_ERR(svn_cstring_atoi64(offset, offset_pos + 1));
+ SVN_ERR(svn_cstring_strtoui64(&temp, offset_pos + 1, 0, APR_SIZE_MAX, 10));
+ *offset = (apr_size_t)temp;
*offset_pos = '/';
if (revision - fs->start_revision > fs->revisions->nelts)
@@ -760,7 +763,7 @@ parse_revnode_pos(revision_info_t **revi
static svn_error_t *
find_noderev(noderev_t **result,
revision_info_t *revision_info,
- apr_int64_t offset)
+ apr_size_t offset)
{
int idx = svn_sort__bsearch_lower_bound(&offset,
revision_info->node_revs,
@@ -784,7 +787,7 @@ parse_pred(noderev_t **result,
fs_fs_t *fs,
svn_string_t *id)
{
- apr_int64_t offset;
+ apr_size_t offset;
revision_info_t *revision_info;
SVN_ERR(parse_revnode_pos(&revision_info, &offset, fs, id));
@@ -797,7 +800,7 @@ static int
compare_representation_offsets(const void *data, const void *key)
{
return (*(const representation_t **)data)->original.offset
- - *(const apr_int64_t *)key;
+ - *(const apr_size_t *)key;
}
static representation_t *
@@ -805,7 +808,7 @@ find_representation(int *idx,
fs_fs_t *fs,
revision_info_t **revision_info,
int revision,
- apr_int64_t offset)
+ apr_size_t offset)
{
revision_info_t *info;
*idx = -1;
@@ -839,16 +842,17 @@ find_representation(int *idx,
static svn_error_t *
read_rep_base(representation_t **representation,
- apr_int64_t *header_size,
+ apr_size_t *header_size,
svn_boolean_t *is_plain,
fs_fs_t *fs,
svn_stringbuf_t *file_content,
- apr_int64_t offset,
+ apr_size_t offset,
apr_pool_t *pool,
apr_pool_t *scratch_pool)
{
char *str, *last_str;
int idx, revision;
+ apr_uint64_t temp;
const char *buffer = file_content->data + offset;
const char *line_end = strchr(buffer, '\n');
@@ -878,9 +882,9 @@ read_rep_base(representation_t **represe
SVN_ERR(svn_cstring_atoi(&revision, str));
str = svn_cstring_tokenize(" ", &last_str);
- SVN_ERR(svn_cstring_atoi64(&offset, str));
+ SVN_ERR(svn_cstring_strtoui64(&temp, str, 0, APR_SIZE_MAX, 10));
- *representation = find_representation(&idx, fs, NULL, revision, offset);
+ *representation = find_representation(&idx, fs, NULL, revision, (apr_size_t)temp);
return SVN_NO_ERROR;
}
@@ -896,25 +900,25 @@ parse_representation(representation_t **
representation_t *result;
int revision;
- apr_int64_t offset;
- svn_filesize_t size;
+ apr_uint64_t offset;
+ apr_uint64_t size;
int idx;
char *c = (char *)value->data;
SVN_ERR(svn_cstring_atoi(&revision, svn_cstring_tokenize(" ", &c)));
- SVN_ERR(svn_cstring_atoi64(&offset, svn_cstring_tokenize(" ", &c)));
- SVN_ERR(svn_cstring_atoi64(&size, svn_cstring_tokenize(" ", &c)));
+ SVN_ERR(svn_cstring_strtoui64(&offset, svn_cstring_tokenize(" ", &c), 0, APR_SIZE_MAX, 10));
+ SVN_ERR(svn_cstring_strtoui64(&size, svn_cstring_tokenize(" ", &c), 0, APR_SIZE_MAX, 10));
- result = find_representation(&idx, fs, &revision_info, revision, offset);
+ result = find_representation(&idx, fs, &revision_info, revision, (apr_size_t)offset);
if (!result)
{
result = apr_pcalloc(pool, sizeof(*result));
result->revision = revision_info;
- result->original.offset = offset;
- result->original.size = size;
+ result->original.offset = (apr_size_t)offset;
+ result->original.size = (apr_size_t)size;
SVN_ERR(read_rep_base(&result->delta_base, &result->header_size,
&result->is_plain, fs, file_content,
- offset + revision_info->original.offset,
+ (apr_size_t)offset + revision_info->original.offset,
pool, scratch_pool));
svn_sort__array_insert(&result, revision_info->representations, idx);
@@ -936,8 +940,8 @@ read_windows(apr_array_header_t **window
svn_string_t *content;
svn_string_t data;
svn_stream_t *stream;
- apr_int64_t offset = representation->original.offset
- + representation->header_size;
+ apr_size_t offset = representation->original.offset
+ + representation->header_size;
char version;
apr_size_t len = sizeof(version);
@@ -977,8 +981,8 @@ read_plain(svn_stringbuf_t **content,
apr_pool_t *pool)
{
svn_string_t *data;
- apr_int64_t offset = representation->original.offset
- + representation->header_size;
+ apr_size_t offset = representation->original.offset
+ + representation->header_size;
SVN_ERR(get_content(&data, fs, representation->revision->revision, pool));
@@ -1051,7 +1055,7 @@ static svn_error_t *
read_noderev(noderev_t **noderev,
fs_fs_t *fs,
svn_stringbuf_t *file_content,
- apr_int64_t offset,
+ apr_size_t offset,
revision_info_t *revision_info,
apr_pool_t *pool,
apr_pool_t *scratch_pool);
@@ -1060,7 +1064,7 @@ static svn_error_t *
get_noderev(noderev_t **noderev,
fs_fs_t *fs,
svn_stringbuf_t *file_content,
- apr_int64_t offset,
+ apr_size_t offset,
revision_info_t *revision_info,
apr_pool_t *pool,
apr_pool_t *scratch_pool)
@@ -1151,7 +1155,7 @@ parse_dir(fs_fs_t *fs,
{
const char *name = svn__apr_hash_index_key(hi);
svn_string_t *str_val = svn__apr_hash_index_val(hi);
- apr_int64_t offset;
+ apr_size_t offset;
revision_info_t *revision_info;
apr_size_t name_len = strlen(name);
direntry_t *entry = base_dir
@@ -1189,7 +1193,7 @@ static svn_error_t *
read_noderev(noderev_t **noderev,
fs_fs_t *fs,
svn_stringbuf_t *file_content,
- apr_int64_t offset,
+ apr_size_t offset,
revision_info_t *revision_info,
apr_pool_t *pool,
apr_pool_t *scratch_pool)
@@ -1297,7 +1301,7 @@ read_pack_file(fs_fs_t *fs,
for (i = 0; i < manifest->nelts; ++i)
{
- apr_int64_t root_node_offset;
+ apr_size_t root_node_offset;
svn_string_t rev_content;
revision_info_t *info = apr_pcalloc(pool, sizeof(*info));
@@ -1305,15 +1309,15 @@ read_pack_file(fs_fs_t *fs,
info->representations = apr_array_make(iter_pool, 4, sizeof(representation_t*));
info->revision = base + i;
- info->original.offset = APR_ARRAY_IDX(manifest, i, apr_int64_t);
+ info->original.offset = APR_ARRAY_IDX(manifest, i, apr_size_t);
info->original.end = i+1 < manifest->nelts
- ? APR_ARRAY_IDX(manifest, i+1 , apr_int64_t)
+ ? APR_ARRAY_IDX(manifest, i+1 , apr_size_t)
: file_content->len;
SVN_ERR(read_revision_header(&info->original.changes,
&info->original.changes_len,
&root_node_offset,
file_content,
- APR_ARRAY_IDX(manifest, i , apr_int64_t),
+ APR_ARRAY_IDX(manifest, i , apr_size_t),
info->original.end,
iter_pool));
@@ -1344,7 +1348,7 @@ read_revision_file(fs_fs_t *fs,
svn_revnum_t revision,
apr_pool_t *pool)
{
- apr_int64_t root_node_offset;
+ apr_size_t root_node_offset;
apr_pool_t *local_pool = svn_pool_create(pool);
svn_stringbuf_t *file_content;
svn_string_t rev_content;
@@ -2436,7 +2440,8 @@ int main(int argc, const char *argv[])
svn_error_t *svn_err;
const char *repo_path = NULL;
svn_revnum_t start_revision = 0;
- apr_int64_t memsize = 0;
+ apr_size_t memsize = 0;
+ apr_uint64_t temp = 0;
fs_fs_t *fs;
apr_initialize();
@@ -2457,7 +2462,7 @@ int main(int argc, const char *argv[])
return 2;
}
- svn_err = svn_cstring_atoi64(&memsize, argv[2]);
+ svn_err = svn_cstring_strtoui64(&temp, argv[2], 0, APR_SIZE_MAX, 10);
if (svn_err)
{
print_usage(ostream, argv[0], pool);
@@ -2465,6 +2470,7 @@ int main(int argc, const char *argv[])
return 2;
}
+ memsize = (apr_size_t)temp;
repo_path = argv[1];
start_revision = 0;