rename uc_context_free() to uc_mem_free(). see #373
This commit is contained in:
@ -17,7 +17,7 @@ func (u *uc) ContextSave(reuse Context) (Context, error) {
|
|||||||
if err := errReturn(C.uc_context_alloc(u.handle, ctx)); err != nil {
|
if err := errReturn(C.uc_context_alloc(u.handle, ctx)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
runtime.SetFinalizer(ctx, func(p Context) { C.uc_context_free(*p) })
|
runtime.SetFinalizer(ctx, func(p Context) { C.uc_mem_free(*p) })
|
||||||
if err := errReturn(C.uc_context_save(u.handle, *ctx)); err != nil {
|
if err := errReturn(C.uc_context_save(u.handle, *ctx)); err != nil {
|
||||||
}
|
}
|
||||||
return ctx, nil
|
return ctx, nil
|
||||||
|
@ -117,7 +117,7 @@ instance Storable MemoryRegion where
|
|||||||
|
|
||||||
-- | Opaque storage for CPU context, used with the context functions.
|
-- | Opaque storage for CPU context, used with the context functions.
|
||||||
{# pointer *uc_context as Context
|
{# pointer *uc_context as Context
|
||||||
foreign finalizer uc_context_free_wrapper as contextFree
|
foreign finalizer uc_mem_free_wrapper as memFree
|
||||||
newtype
|
newtype
|
||||||
#}
|
#}
|
||||||
|
|
||||||
@ -125,11 +125,11 @@ instance Storable MemoryRegion where
|
|||||||
{# pointer *uc_context as ContextPtr -> Context #}
|
{# pointer *uc_context as ContextPtr -> Context #}
|
||||||
|
|
||||||
-- | Make a CPU context out of a context pointer. The returned CPU context will
|
-- | Make a CPU context out of a context pointer. The returned CPU context will
|
||||||
-- automatically call 'uc_context_free' when it goes out of scope.
|
-- automatically call 'uc_mem_free' when it goes out of scope.
|
||||||
mkContext :: ContextPtr
|
mkContext :: ContextPtr
|
||||||
-> IO Context
|
-> IO Context
|
||||||
mkContext ptr =
|
mkContext ptr =
|
||||||
liftM Context (newForeignPtr contextFree ptr)
|
liftM Context (newForeignPtr memFree ptr)
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- Emulator control
|
-- Emulator control
|
||||||
|
@ -7,6 +7,6 @@ void uc_close_wrapper(uc_engine *uc) {
|
|||||||
void uc_close_dummy(uc_engine *uc) {
|
void uc_close_dummy(uc_engine *uc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void uc_context_free_wrapper(uc_context *context) {
|
void uc_mem_free_wrapper(void *mem) {
|
||||||
uc_context_free(context);
|
uc_mem_free(mem);
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,8 @@ void uc_close_wrapper(uc_engine *uc);
|
|||||||
void uc_close_dummy(uc_engine *uc);
|
void uc_close_dummy(uc_engine *uc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wrap Unicorn's uc_context_free function and ignore the returned error code.
|
* Wrap Unicorn's uc_mem_free function and ignore the returned error code.
|
||||||
*/
|
*/
|
||||||
void uc_context_free_wrapper(uc_context *context);
|
void uc_mem_free_wrapper(void *context);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -746,7 +746,7 @@ JNIEXPORT jlong JNICALL Java_unicorn_Unicorn_context_1alloc
|
|||||||
*/
|
*/
|
||||||
JNIEXPORT void JNICALL Java_unicorn_Unicorn_context_1free
|
JNIEXPORT void JNICALL Java_unicorn_Unicorn_context_1free
|
||||||
(JNIEnv *env, jobject self, jlong ctx) {
|
(JNIEnv *env, jobject self, jlong ctx) {
|
||||||
uc_err err = uc_context_free((uc_context*)ctx);
|
uc_err err = uc_mem_free((void *)ctx);
|
||||||
if (err != UC_ERR_OK) {
|
if (err != UC_ERR_OK) {
|
||||||
throwException(env, err);
|
throwException(env, err);
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ _setup_prototype(_uc, "uc_mem_unmap", ucerr, uc_engine, ctypes.c_uint64, ctypes.
|
|||||||
_setup_prototype(_uc, "uc_mem_protect", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_uint32)
|
_setup_prototype(_uc, "uc_mem_protect", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_uint32)
|
||||||
_setup_prototype(_uc, "uc_query", ucerr, uc_engine, ctypes.c_uint32, ctypes.POINTER(ctypes.c_size_t))
|
_setup_prototype(_uc, "uc_query", ucerr, uc_engine, ctypes.c_uint32, ctypes.POINTER(ctypes.c_size_t))
|
||||||
_setup_prototype(_uc, "uc_context_alloc", ucerr, uc_engine, ctypes.POINTER(uc_context))
|
_setup_prototype(_uc, "uc_context_alloc", ucerr, uc_engine, ctypes.POINTER(uc_context))
|
||||||
_setup_prototype(_uc, "uc_context_free", ucerr, uc_context)
|
_setup_prototype(_uc, "uc_mem_free", ucerr, ctypes.c_void_p)
|
||||||
_setup_prototype(_uc, "uc_context_save", ucerr, uc_engine, uc_context)
|
_setup_prototype(_uc, "uc_context_save", ucerr, uc_engine, uc_context)
|
||||||
_setup_prototype(_uc, "uc_context_restore", ucerr, uc_engine, uc_context)
|
_setup_prototype(_uc, "uc_context_restore", ucerr, uc_engine, uc_context)
|
||||||
|
|
||||||
@ -496,7 +496,7 @@ class SavedContext(object):
|
|||||||
self.pointer = pointer
|
self.pointer = pointer
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
status = _uc.uc_context_free(self.pointer)
|
status = _uc.uc_mem_free(self.pointer)
|
||||||
if status != uc.UC_ERR_OK:
|
if status != uc.UC_ERR_OK:
|
||||||
raise UcError(status)
|
raise UcError(status)
|
||||||
|
|
||||||
|
@ -642,7 +642,7 @@ uc_err uc_mem_protect(uc_engine *uc, uint64_t address, size_t size, uint32_t per
|
|||||||
|
|
||||||
@uc: handle returned by uc_open()
|
@uc: handle returned by uc_open()
|
||||||
@regions: pointer to an array of uc_mem_region struct. This is allocated by
|
@regions: pointer to an array of uc_mem_region struct. This is allocated by
|
||||||
Unicorn, and must be freed by user later
|
Unicorn, and must be freed by user later with uc_mem_free()
|
||||||
@count: pointer to number of struct uc_mem_region contained in @regions
|
@count: pointer to number of struct uc_mem_region contained in @regions
|
||||||
|
|
||||||
@return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
|
@return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
|
||||||
@ -660,6 +660,7 @@ uc_err uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count);
|
|||||||
@uc: handle returned by uc_open()
|
@uc: handle returned by uc_open()
|
||||||
@context: pointer to a uc_engine*. This will be updated with the pointer to
|
@context: pointer to a uc_engine*. This will be updated with the pointer to
|
||||||
the new context on successful return of this function.
|
the new context on successful return of this function.
|
||||||
|
Later, this allocated memory must be freed with uc_mem_free().
|
||||||
|
|
||||||
@return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
|
@return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
|
||||||
for detailed error).
|
for detailed error).
|
||||||
@ -668,15 +669,16 @@ UNICORN_EXPORT
|
|||||||
uc_err uc_context_alloc(uc_engine *uc, uc_context **context);
|
uc_err uc_context_alloc(uc_engine *uc, uc_context **context);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Free the resource allocated by uc_context_alloc.
|
Free the memory allocated by uc_context_alloc & uc_mem_regions.
|
||||||
|
|
||||||
@context: handle returned by uc_context_alloc()
|
@mem: memory allocated by uc_context_alloc (returned in *context), or
|
||||||
|
by uc_mem_regions (returned in *regions)
|
||||||
|
|
||||||
@return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
|
@return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
|
||||||
for detailed error).
|
for detailed error).
|
||||||
*/
|
*/
|
||||||
UNICORN_EXPORT
|
UNICORN_EXPORT
|
||||||
uc_err uc_context_free(uc_context *context);
|
uc_err uc_mem_free(void *mem);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Save a copy of the internal CPU context.
|
Save a copy of the internal CPU context.
|
||||||
|
@ -759,9 +759,9 @@ static void test_i386_context_save(void)
|
|||||||
printf(">>> EAX = 0x%x\n", r_eax);
|
printf(">>> EAX = 0x%x\n", r_eax);
|
||||||
|
|
||||||
// free the CPU context
|
// free the CPU context
|
||||||
err = uc_context_free(context);
|
err = uc_mem_free(context);
|
||||||
if (err) {
|
if (err) {
|
||||||
printf("Failed on uc_context_free() with error returned: %u\n", err);
|
printf("Failed on uc_mem_free() with error returned: %u\n", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ int main(int argc, char **argv, char **envp) {
|
|||||||
starts[i], regions[i].begin);
|
starts[i], regions[i].begin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(regions);
|
uc_mem_free(regions);
|
||||||
}
|
}
|
||||||
|
|
||||||
uc_close(uc);
|
uc_close(uc);
|
||||||
|
@ -800,7 +800,7 @@ static void test_i386_reg_save(void **state)
|
|||||||
assert_int_equal(eax, 2);
|
assert_int_equal(eax, 2);
|
||||||
|
|
||||||
// clean up;
|
// clean up;
|
||||||
uc_context_free(saved_context);
|
uc_mem_free(saved_context);
|
||||||
uc_assert_success(uc_close(uc));
|
uc_assert_success(uc_close(uc));
|
||||||
}
|
}
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
12
uc.c
12
uc.c
@ -28,10 +28,10 @@
|
|||||||
static void free_table(gpointer key, gpointer value, gpointer data)
|
static void free_table(gpointer key, gpointer value, gpointer data)
|
||||||
{
|
{
|
||||||
TypeInfo *ti = (TypeInfo*) value;
|
TypeInfo *ti = (TypeInfo*) value;
|
||||||
g_free((void*) ti->class);
|
g_free((void *) ti->class);
|
||||||
g_free((void*) ti->name);
|
g_free((void *) ti->name);
|
||||||
g_free((void*) ti->parent);
|
g_free((void *) ti->parent);
|
||||||
g_free((void*) ti);
|
g_free((void *) ti);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNICORN_EXPORT
|
UNICORN_EXPORT
|
||||||
@ -1193,9 +1193,9 @@ uc_err uc_context_alloc(uc_engine *uc, uc_context **context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
UNICORN_EXPORT
|
UNICORN_EXPORT
|
||||||
uc_err uc_context_free(uc_context *context)
|
uc_err uc_mem_free(void *mem)
|
||||||
{
|
{
|
||||||
free(context);
|
g_free(mem);
|
||||||
return UC_ERR_OK;
|
return UC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user