Skip to content

Commit

Permalink
java: add CopyFromBuffer helper and ensure the properly sized ByteBuf…
Browse files Browse the repository at this point in the history
…fer is used
  • Loading branch information
axic committed Oct 9, 2020
1 parent b31abb1 commit d02c772
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 24 deletions.
4 changes: 4 additions & 0 deletions bindings/java/c/evmc-vm.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ JNIEXPORT jobject JNICALL Java_org_ethereum_evmc_EvmcVm_execute(JNIEnv* jenv,
jobject jcode,
jint jcode_size)
{
jint rs = evmc_java_set_jvm(jenv);
(void)rs;
assert(rs == JNI_OK);

(void)jcls;
struct evmc_message* msg = (struct evmc_message*)(*jenv)->GetDirectBufferAddress(jenv, jmsg);
assert(msg != NULL);
Expand Down
54 changes: 30 additions & 24 deletions bindings/java/c/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,20 @@ static jbyteArray CopyDataToJava(JNIEnv* jenv, const void* ptr, size_t size)
return ret;
}

static void CopyFromByteBuffer(JNIEnv* jenv, jobject src, void* dst, size_t size)
{
jlong src_size = (*jenv)->GetDirectBufferCapacity(jenv, src);
if (src_size != size)
{
jclass exception_class = (*jenv)->FindClass(jenv, "java/lang/IllegalArgumentException");
assert(exception_class != NULL);
(*jenv)->ThrowNew(jenv, exception_class, "Unexpected length.");
}
void* ptr = (*jenv)->GetDirectBufferAddress(jenv, src);
assert(ptr != NULL);
memcpy(dst, ptr, size);
}

static bool account_exists_fn(struct evmc_host_context* context, const evmc_address* address)
{
const char java_method_name[] = "account_exists";
Expand Down Expand Up @@ -87,11 +101,10 @@ static evmc_bytes32 get_storage_fn(struct evmc_host_context* context,
// call java method
jobject jresult =
(*jenv)->CallStaticObjectMethod(jenv, host_class, method, (jobject)context, jaddress, jkey);

assert(jresult != NULL);
evmc_bytes32* result_ptr = (struct evmc_bytes32*)(*jenv)->GetDirectBufferAddress(jenv, jresult);
assert(result_ptr != NULL);
return *result_ptr; // copy here
struct evmc_bytes32 result;
CopyFromByteBuffer(jenv, jresult, &result, sizeof(struct evmc_bytes32));
return result;
}

static enum evmc_storage_status set_storage_fn(struct evmc_host_context* context,
Expand Down Expand Up @@ -149,10 +162,8 @@ static evmc_uint256be get_balance_fn(struct evmc_host_context* context, const ev
jobject jresult =
(*jenv)->CallStaticObjectMethod(jenv, host_class, method, (jobject)context, jaddress);
assert(jresult != NULL);

evmc_uint256be* result_ptr = (evmc_uint256be*)(*jenv)->GetDirectBufferAddress(jenv, jresult);
assert(result_ptr != NULL);
evmc_uint256be result = *result_ptr; // copy here
struct evmc_uint256be result;
CopyFromByteBuffer(jenv, jresult, &result, sizeof(struct evmc_uint256be));

(*jenv)->ReleaseByteArrayElements(jenv, jaddress, (jbyte*)address, 0);

Expand Down Expand Up @@ -209,10 +220,8 @@ static evmc_bytes32 get_code_hash_fn(struct evmc_host_context* context, const ev
jobject jresult =
(*jenv)->CallStaticObjectMethod(jenv, host_class, method, (jobject)context, jaddress);
assert(jresult != NULL);

evmc_bytes32* result_ptr = (struct evmc_bytes32*)(*jenv)->GetDirectBufferAddress(jenv, jresult);
assert(result_ptr != NULL);
evmc_bytes32 result = *result_ptr; // copy here
struct evmc_bytes32 result;
CopyFromByteBuffer(jenv, jresult, &result, sizeof(struct evmc_bytes32));

(*jenv)->ReleaseByteArrayElements(jenv, jaddress, (jbyte*)address, 0);

Expand Down Expand Up @@ -317,11 +326,9 @@ static struct evmc_result call_fn(struct evmc_host_context* context, const struc
jobject jresult =
(*jenv)->CallStaticObjectMethod(jenv, host_class, method, (jobject)context, jmsg);
assert(jresult != NULL);

struct evmc_result* result_ptr =
(struct evmc_result*)(*jenv)->GetDirectBufferAddress(jenv, jresult);
assert(result_ptr != NULL);
return *result_ptr; // copy here
struct evmc_result result;
CopyFromByteBuffer(jenv, jresult, &result, sizeof(struct evmc_result));
return result;
}

static struct evmc_tx_context get_tx_context_fn(struct evmc_host_context* context)
Expand All @@ -345,10 +352,9 @@ static struct evmc_tx_context get_tx_context_fn(struct evmc_host_context* contex
jobject jresult = (*jenv)->CallStaticObjectMethod(jenv, host_class, method, (jobject)context);
assert(jresult != NULL);

struct evmc_tx_context* result_ptr =
(struct evmc_tx_context*)(*jenv)->GetDirectBufferAddress(jenv, jresult);
assert(result_ptr != NULL);
return *result_ptr; // copy here
struct evmc_tx_context result;
CopyFromByteBuffer(jenv, jresult, &result, sizeof(struct evmc_tx_context));
return result;
}

static evmc_bytes32 get_block_hash_fn(struct evmc_host_context* context, int64_t number)
Expand All @@ -373,9 +379,9 @@ static evmc_bytes32 get_block_hash_fn(struct evmc_host_context* context, int64_t
(*jenv)->CallStaticObjectMethod(jenv, host_class, method, (jobject)context, (jlong)number);
assert(jresult != NULL);

evmc_bytes32* result_ptr = (struct evmc_bytes32*)(*jenv)->GetDirectBufferAddress(jenv, jresult);
assert(result_ptr != NULL);
return *result_ptr; // copy here
struct evmc_bytes32 result;
CopyFromByteBuffer(jenv, jresult, &result, sizeof(struct evmc_bytes32));
return result;
}

static void emit_log_fn(struct evmc_host_context* context,
Expand Down

0 comments on commit d02c772

Please sign in to comment.