static int load(RBinFile *arch) { struct r_bin_java_obj_t* bin_obj = NULL; int result = R_FALSE; bin_obj = r_bin_java_new_buf (arch->buf, arch->o->loadaddr, arch->o->kv); if (bin_obj) { if (arch->o->kv == NULL) arch->o->kv = bin_obj->kv; arch->o->bin_obj = bin_obj; bin_obj->AllJavaBinObjs = DB; // XXX - /\ this is a hack, but (one way but) necessary to get access to // the object addrs from anal. If only global variables are used, // they get "lost" somehow after they are initialized and go out of // scope. // // There are several points of indirection, but here is the gist: // 1) RAnal->(through RBinBind) RBin->RBinJavaObj->DB // // The purpose is to ensure that information about a give class file // can be grabbed at any time from RAnal. This was tried with global // variables, but failed when attempting to access the DB // in the class.c scope. Once DB was moved here, it is initialized // once here and assigned to each of the other RBinJavaObjs. // // Now, the RAnal component of radare can get to each of the // RBinJavaObjs for analysing functions and dependencies using an Sdb. add_bin_obj_to_sdb (bin_obj); if (arch->file) bin_obj->file = strdup (arch->file); result = R_TRUE; } return result; }
static void * load_bytes(const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb){ void *res = NULL; RBuffer *tbuf = NULL; struct r_bin_java_obj_t* bin_obj = NULL; if (!buf || sz == 0 || sz == UT64_MAX) return NULL; tbuf = r_buf_new(); r_buf_set_bytes (tbuf, buf, sz); res = bin_obj = r_bin_java_new_buf (tbuf, loadaddr, sdb); add_bin_obj_to_sdb (bin_obj); r_buf_free (tbuf); return res; }
static void *load_bytes(RBinFile *bf, const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb){ struct r_bin_java_obj_t *bin_obj = NULL; RBuffer *tbuf = NULL; void *res = NULL; if (!buf || sz == 0 || sz == UT64_MAX) { return NULL; } tbuf = r_buf_new (); r_buf_set_bytes (tbuf, buf, sz); res = bin_obj = r_bin_java_new_buf (tbuf, loadaddr, sdb); add_bin_obj_to_sdb (bin_obj); if (bf && bf->file) { bin_obj->file = strdup (bf->file); } r_buf_free (tbuf); return res; }
static bool load(RBinFile *bf) { int result = false; const ut8 *bytes = bf? r_buf_buffer (bf->buf): NULL; ut64 sz = bf? r_buf_size (bf->buf): 0; struct r_bin_java_obj_t *bin_obj = NULL; if (!bf || !bf->o) { return false; } bin_obj = load_bytes (bf, bytes, sz, bf->o->loadaddr, bf->sdb); if (bin_obj) { if (!bf->o->kv) { bf->o->kv = bin_obj->kv; } bf->o->bin_obj = bin_obj; bin_obj->AllJavaBinObjs = DB; // XXX - /\ this is a hack, but (one way but) necessary to get access to // the object addrs from anal. If only global variables are used, // they get "lost" somehow after they are initialized and go out of // scope. // // There are several points of indirection, but here is the gist: // 1) RAnal->(through RBinBind) RBin->RBinJavaObj->DB // // The purpose is to ensure that information about a give class file // can be grabbed at any time from RAnal. This was tried with global // variables, but failed when attempting to access the DB // in the class.c scope. Once DB was moved here, it is initialized // once here and assigned to each of the other RBinJavaObjs. // // Now, the RAnal component of radare can get to each of the // RBinJavaObjs for analysing functions and dependencies using an Sdb. add_bin_obj_to_sdb (bin_obj); if (bf->file) { bin_obj->file = strdup (bf->file); } result = true; } return result; }