diff --git a/Makefile b/Makefile index 46300981..ddf25f72 100644 --- a/Makefile +++ b/Makefile @@ -279,6 +279,7 @@ dist: git archive --format=zip --prefix=unicorn-$(DIST_VERSION)/ $(TAG) > unicorn-$(DIST_VERSION).zip +# run "make header" whenever qemu/header_gen.py is modified header: $(eval TARGETS := m68k arm aarch64 mips mipsel mips64 mips64el\ powerpc sparc sparc64 x86_64) diff --git a/uc.c b/uc.c index 5aba88af..8282a8ed 100644 --- a/uc.c +++ b/uc.c @@ -1069,19 +1069,19 @@ uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, UNICORN_EXPORT uc_err uc_hook_del(uc_engine *uc, uc_hook hh) { - int i = 0; + int i; struct hook *hook = (struct hook *)hh; - int type = hook->type; - - while ((type >> i) > 0 && i < UC_HOOK_MAX) { - if ((type >> i) & 1) { - if (list_remove(&uc->hook[i], (void *)hh)) { - if (--hook->refs == 0) { - free(hook); - } + // we can't dereference hook->type if hook is invalid + // so for now we need to iterate over all possible types to remove the hook + // which is less efficient + // an optimization would be to align the hook pointer + // and store the type mask in the hook pointer. + for (i = 0; i < UC_HOOK_MAX; i++) { + if (list_remove(&uc->hook[i], (void *)hook)) { + if (--hook->refs == 0) { + free(hook); } } - i++; } return UC_ERR_OK; }