rename uc_context_free() to uc_mem_free(). see #373

This commit is contained in:
Nguyen Anh Quynh
2017-01-09 20:52:14 +08:00
parent af165d254c
commit fdbbdc6216
11 changed files with 27 additions and 25 deletions

View File

@ -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

View File

@ -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

View File

@ -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);
} }

View File

@ -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

View File

@ -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);
} }

View File

@ -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)

View File

@ -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.

View File

@ -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;
} }

View File

@ -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);

View File

@ -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
View File

@ -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;
} }