Skip to content

Commit 94e43a1

Browse files
committed
[Java] Fixed 32-bit overflowing issue when converting jlong to size_t
Summary: Fixed 32-bit overflowing issue when converting jlong to size_t by capping jlong to std::numeric_limits<size_t>::max(). Test Plan: make rocksdbjava make jtest Reviewers: ankgup87, ljin, sdong, igor Reviewed By: igor Subscribers: leveldb Differential Revision: https://reviews.facebook.net/D23511
1 parent f090575 commit 94e43a1

File tree

4 files changed

+22
-13
lines changed

4 files changed

+22
-13
lines changed

java/rocksjni/memtablejni.cc

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
//
66
// This file implements the "bridge" between Java and C++ for MemTables.
77

8+
#include "rocksjni/portal.h"
89
#include "include/org_rocksdb_HashSkipListMemTableConfig.h"
910
#include "include/org_rocksdb_HashLinkedListMemTableConfig.h"
1011
#include "include/org_rocksdb_VectorMemTableConfig.h"
@@ -20,7 +21,7 @@ jlong Java_org_rocksdb_HashSkipListMemTableConfig_newMemTableFactoryHandle(
2021
JNIEnv* env, jobject jobj, jlong jbucket_count,
2122
jint jheight, jint jbranching_factor) {
2223
return reinterpret_cast<jlong>(rocksdb::NewHashSkipListRepFactory(
23-
static_cast<size_t>(jbucket_count),
24+
rocksdb::jlong_to_size_t(jbucket_count),
2425
static_cast<int32_t>(jheight),
2526
static_cast<int32_t>(jbranching_factor)));
2627
}
@@ -33,7 +34,7 @@ jlong Java_org_rocksdb_HashSkipListMemTableConfig_newMemTableFactoryHandle(
3334
jlong Java_org_rocksdb_HashLinkedListMemTableConfig_newMemTableFactoryHandle(
3435
JNIEnv* env, jobject jobj, jlong jbucket_count) {
3536
return reinterpret_cast<jlong>(rocksdb::NewHashLinkListRepFactory(
36-
static_cast<size_t>(jbucket_count)));
37+
rocksdb::jlong_to_size_t(jbucket_count)));
3738
}
3839

3940
/*
@@ -44,7 +45,7 @@ jlong Java_org_rocksdb_HashLinkedListMemTableConfig_newMemTableFactoryHandle(
4445
jlong Java_org_rocksdb_VectorMemTableConfig_newMemTableFactoryHandle(
4546
JNIEnv* env, jobject jobj, jlong jreserved_size) {
4647
return reinterpret_cast<jlong>(new rocksdb::VectorRepFactory(
47-
static_cast<size_t>(jreserved_size)));
48+
rocksdb::jlong_to_size_t(jreserved_size)));
4849
}
4950

5051
/*

java/rocksjni/options.cc

+10-9
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ jboolean Java_org_rocksdb_Options_createIfMissing(
7070
void Java_org_rocksdb_Options_setWriteBufferSize(
7171
JNIEnv* env, jobject jobj, jlong jhandle, jlong jwrite_buffer_size) {
7272
reinterpret_cast<rocksdb::Options*>(jhandle)->write_buffer_size =
73-
static_cast<size_t>(jwrite_buffer_size);
73+
rocksdb::jlong_to_size_t(jwrite_buffer_size);
7474
}
7575

7676

@@ -362,7 +362,7 @@ jlong Java_org_rocksdb_Options_maxLogFileSize(
362362
void Java_org_rocksdb_Options_setMaxLogFileSize(
363363
JNIEnv* env, jobject jobj, jlong jhandle, jlong max_log_file_size) {
364364
reinterpret_cast<rocksdb::Options*>(jhandle)->max_log_file_size =
365-
static_cast<size_t>(max_log_file_size);
365+
rocksdb::jlong_to_size_t(max_log_file_size);
366366
}
367367

368368
/*
@@ -383,7 +383,7 @@ jlong Java_org_rocksdb_Options_logFileTimeToRoll(
383383
void Java_org_rocksdb_Options_setLogFileTimeToRoll(
384384
JNIEnv* env, jobject jobj, jlong jhandle, jlong log_file_time_to_roll) {
385385
reinterpret_cast<rocksdb::Options*>(jhandle)->log_file_time_to_roll =
386-
static_cast<size_t>(log_file_time_to_roll);
386+
rocksdb::jlong_to_size_t(log_file_time_to_roll);
387387
}
388388

389389
/*
@@ -404,7 +404,7 @@ jlong Java_org_rocksdb_Options_keepLogFileNum(
404404
void Java_org_rocksdb_Options_setKeepLogFileNum(
405405
JNIEnv* env, jobject jobj, jlong jhandle, jlong keep_log_file_num) {
406406
reinterpret_cast<rocksdb::Options*>(jhandle)->keep_log_file_num =
407-
static_cast<size_t>(keep_log_file_num);
407+
rocksdb::jlong_to_size_t(keep_log_file_num);
408408
}
409409

410410
/*
@@ -509,7 +509,8 @@ void Java_org_rocksdb_Options_setTableCacheRemoveScanCountLimit(
509509
void Java_org_rocksdb_Options_useFixedLengthPrefixExtractor(
510510
JNIEnv* env, jobject jobj, jlong jhandle, jint jprefix_length) {
511511
reinterpret_cast<rocksdb::Options*>(jhandle)->prefix_extractor.reset(
512-
rocksdb::NewFixedPrefixTransform(static_cast<size_t>(jprefix_length)));
512+
rocksdb::NewFixedPrefixTransform(
513+
rocksdb::jlong_to_size_t(jprefix_length)));
513514
}
514515

515516
/*
@@ -573,7 +574,7 @@ jlong Java_org_rocksdb_Options_manifestPreallocationSize(
573574
void Java_org_rocksdb_Options_setManifestPreallocationSize(
574575
JNIEnv* env, jobject jobj, jlong jhandle, jlong preallocation_size) {
575576
reinterpret_cast<rocksdb::Options*>(jhandle)->manifest_preallocation_size =
576-
static_cast<size_t>(preallocation_size);
577+
rocksdb::jlong_to_size_t(preallocation_size);
577578
}
578579

579580
/*
@@ -1245,7 +1246,7 @@ jlong Java_org_rocksdb_Options_arenaBlockSize(
12451246
void Java_org_rocksdb_Options_setArenaBlockSize(
12461247
JNIEnv* env, jobject jobj, jlong jhandle, jlong jarena_block_size) {
12471248
reinterpret_cast<rocksdb::Options*>(jhandle)->arena_block_size =
1248-
static_cast<size_t>(jarena_block_size);
1249+
rocksdb::jlong_to_size_t(jarena_block_size);
12491250
}
12501251

12511252
/*
@@ -1410,7 +1411,7 @@ void Java_org_rocksdb_Options_setInplaceUpdateNumLocks(
14101411
jlong jinplace_update_num_locks) {
14111412
reinterpret_cast<rocksdb::Options*>(
14121413
jhandle)->inplace_update_num_locks =
1413-
static_cast<size_t>(jinplace_update_num_locks);
1414+
rocksdb::jlong_to_size_t(jinplace_update_num_locks);
14141415
}
14151416

14161417
/*
@@ -1501,7 +1502,7 @@ void Java_org_rocksdb_Options_setMaxSuccessiveMerges(
15011502
JNIEnv* env, jobject jobj, jlong jhandle,
15021503
jlong jmax_successive_merges) {
15031504
reinterpret_cast<rocksdb::Options*>(jhandle)->max_successive_merges =
1504-
static_cast<size_t>(jmax_successive_merges);
1505+
rocksdb::jlong_to_size_t(jmax_successive_merges);
15051506
}
15061507

15071508
/*

java/rocksjni/portal.h

+7
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,19 @@
1111
#define JAVA_ROCKSJNI_PORTAL_H_
1212

1313
#include <jni.h>
14+
#include <limits>
1415
#include "rocksdb/db.h"
1516
#include "rocksdb/filter_policy.h"
1617
#include "rocksdb/utilities/backupable_db.h"
1718

1819
namespace rocksdb {
1920

21+
inline size_t jlong_to_size_t(const jlong& jvalue) {
22+
return static_cast<uint64_t>(jvalue) <=
23+
static_cast<uint64_t>(std::numeric_limits<size_t>::max()) ?
24+
static_cast<size_t>(jvalue) : std::numeric_limits<size_t>::max();
25+
}
26+
2027
// The portal class for org.rocksdb.RocksDB
2128
class RocksDBJni {
2229
public:

java/rocksjni/write_batch.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
void Java_org_rocksdb_WriteBatch_newWriteBatch(
3131
JNIEnv* env, jobject jobj, jint jreserved_bytes) {
3232
rocksdb::WriteBatch* wb = new rocksdb::WriteBatch(
33-
static_cast<size_t>(jreserved_bytes));
33+
rocksdb::jlong_to_size_t(jreserved_bytes));
3434

3535
rocksdb::WriteBatchJni::setHandle(env, jobj, wb);
3636
}

0 commit comments

Comments
 (0)