static void wrap_post(void *wrapcxt, void *user_data) { size_t sz = (size_t) user_data; /* test out-of-memory by having a random moderately-large alloc fail */ if (sz > 1024 && dr_get_random_value(1000) < 10) { bool ok = drwrap_set_retval(wrapcxt, NULL); DR_ASSERT(ok); dr_mutex_lock(max_lock); malloc_oom++; dr_mutex_unlock(max_lock); } }
static void wrap_post(void *wrapcxt, void *user_data) { bool ok; CHECK(wrapcxt != NULL, "invalid arg"); if (drwrap_get_func(wrapcxt) == addr_level0) { dr_fprintf(STDERR, " <post-level0>\n"); /* not preserved for no-frills */ CHECK(load_count == 2 || user_data == (void *)99, "user_data not preserved"); CHECK(drwrap_get_retval(wrapcxt) == (void *) 42, "get_retval error"); } else if (drwrap_get_func(wrapcxt) == addr_level1) { dr_fprintf(STDERR, " <post-level1>\n"); ok = drwrap_set_retval(wrapcxt, (void *) -4); CHECK(ok, "set_retval error"); } else if (drwrap_get_func(wrapcxt) == addr_tailcall) { dr_fprintf(STDERR, " <post-makes_tailcall>\n"); } else if (drwrap_get_func(wrapcxt) == addr_level2) { dr_fprintf(STDERR, " <post-level2>\n"); } else if (drwrap_get_func(wrapcxt) == addr_skipme) { CHECK(false, "should have skipped!"); } else if (drwrap_get_func(wrapcxt) == addr_repeat) { dr_fprintf(STDERR, " <post-repeat#%d>\n", repeated ? 2 : 1); if (!repeated) { dr_mcontext_t *mc = drwrap_get_mcontext(wrapcxt); mc->pc = addr_repeat; mc->xsp = repeat_xsp; #ifdef ARM mc->lr = repeat_link; #endif CHECK(drwrap_redirect_execution(wrapcxt) == DREXT_SUCCESS, "redirect rejected"); CHECK(drwrap_redirect_execution(wrapcxt) != DREXT_SUCCESS, "allowed duplicate redirect"); } repeated = !repeated; } else if (drwrap_get_func(wrapcxt) == addr_postonly) { dr_fprintf(STDERR, " <post-postonly>\n"); drwrap_unwrap(addr_skipme, wrap_pre, wrap_post); CHECK(!drwrap_is_wrapped(addr_skipme, wrap_pre, wrap_post), "drwrap_is_wrapped query failed"); drwrap_unwrap(addr_postonly, NULL, wrap_post); CHECK(!drwrap_is_wrapped(addr_postonly, NULL, wrap_post), "drwrap_is_wrapped query failed"); drwrap_unwrap(addr_runlots, NULL, wrap_post); CHECK(!drwrap_is_wrapped(addr_runlots, NULL, wrap_post), "drwrap_is_wrapped query failed"); } else if (drwrap_get_func(wrapcxt) == addr_runlots) { dr_fprintf(STDERR, " <post-runlots>\n"); } else CHECK(false, "invalid wrap"); }
static void wrap_post(void *wrapcxt, void *user_data) { #ifdef SHOW_RESULTS /* we want determinism in our test suite */ size_t sz = (size_t) user_data; /* test out-of-memory by having a random moderately-large alloc fail */ if (sz > 1024 && dr_get_random_value(1000) < 10) { bool ok = drwrap_set_retval(wrapcxt, NULL); DR_ASSERT(ok); dr_mutex_lock(max_lock); malloc_oom++; dr_mutex_unlock(max_lock); } #endif }
/* * Wrap the dry_run() function in testsc.c, to tell it we're here. */ static void wrap_dryrun(void *wrapctx, void *user_data) { drwrap_set_retval(wrapctx, (void *)0); }