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 40124d0 commit 4aee303
Showing 1 changed file with 31 additions and 24 deletions.
55 changes: 31 additions & 24 deletions bindings/java/c/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include <assert.h>
#include <stdlib.h>
#include <string.h>

#include "host.h"

Expand Down Expand Up @@ -34,6 +35,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)
{
size_t src_size = (size_t)(*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 +102,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 +163,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
evmc_uint256be result;
CopyFromByteBuffer(jenv, jresult, &result, sizeof(evmc_uint256be));

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

Expand Down Expand Up @@ -209,10 +221,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 +327,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 +353,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 +380,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 4aee303

Please sign in to comment.