Fix infinite loop, bring back the java crash to greenify

This commit is contained in:
pancake 2015-11-20 14:46:23 +01:00
parent e25c7b33d3
commit 6e67049d6f
3 changed files with 41 additions and 47 deletions

View File

@ -1762,7 +1762,7 @@ static void cmd_anal_esil(RCore *core, const char *input) {
cmd_esil_mem (core, input+2); cmd_esil_mem (core, input+2);
break; break;
case 'p': // initialize pc = $$ case 'p': // initialize pc = $$
r_core_cmd0 (core, "ar pc=$$"); r_core_cmd0 (core, "ar PC=$$");
break; break;
case '?': case '?':
cmd_esil_mem (core, "?"); cmd_esil_mem (core, "?");
@ -1947,8 +1947,7 @@ static void cmd_anal_noreturn(RCore *core, const char *input) {
"an[n]", " sym.imp.exit", "same as above but for flag/fcn names", "an[n]", " sym.imp.exit", "same as above but for flag/fcn names",
"an", "-*", "remove all no-return references", "an", "-*", "remove all no-return references",
"an", "", "list them all", "an", "", "list them all",
"ao*", "", "display opcode in r commands", NULL };
NULL};
switch (input[0]) { switch (input[0]) {
case '-': case '-':
r_anal_noreturn_drop (core->anal, input+1); r_anal_noreturn_drop (core->anal, input+1);

View File

@ -22,7 +22,7 @@ CFLAGS+=-DMINGW32=1
endif endif
#CFLAGS+=-g -ggdb CFLAGS+=-g -ggdb
CFLAGS+=-I../../libr/include CFLAGS+=-I../../libr/include
LDFLAGS+=-L../../libr/util LDFLAGS+=-L../../libr/util
OBJS=code.o class.o ops.o dsojson.o OBJS=code.o class.o ops.o dsojson.o

View File

@ -574,13 +574,14 @@ R_API char * r_bin_java_unmangle_method (const char *flags, const char *name, co
const char *fmt = flags ? "%s %s %s (%s)" : "%s%s %s (%s)"; const char *fmt = flags ? "%s %s %s (%s)" : "%s%s %s (%s)";
char *str = NULL, *f_val_str = NULL, *r_val_str = NULL, *prototype = NULL, *p_val_str = NULL; char *str = NULL, *f_val_str = NULL, *r_val_str = NULL, *prototype = NULL, *p_val_str = NULL;
ut32 params_idx = 0, params_len = 0, prototype_len = 0; ut32 params_idx = 0, params_len = 0, prototype_len = 0;
extract_type_value (r_value, &r_val_str); if (!extract_type_value (r_value, &r_val_str))
return NULL;
if (!r_val_str) r_val_str = strdup ("UNKNOWN"); if (!r_val_str) r_val_str = strdup ("UNKNOWN");
f_val_str = flags ? strdup(flags) : strdup (""); f_val_str = strdup (flags? flags: "");
params_idx = 0; params_idx = 0;
r_list_foreach (the_list, iter, str) { r_list_foreach (the_list, iter, str) {
if (params_idx > 0) params_len += (strlen(str) + 2); // comma + space params_len += strlen (str);
else params_len += strlen(str); if (params_idx > 0) params_len += 2;
params_idx++; params_idx++;
} }
if (params_len > 0) { if (params_len > 0) {
@ -848,31 +849,22 @@ R_API char * r_bin_java_create_method_fq_str(const char *klass, const char* name
} }
R_API char * r_bin_java_create_field_fq_str(const char *klass, const char* name, const char *signature) { R_API char * r_bin_java_create_field_fq_str(const char *klass, const char* name, const char *signature) {
const char *fmt = "%s %s.%s";
char *res = NULL;
int res_len = 2;
if (!klass) klass = "null_class"; if (!klass) klass = "null_class";
if (!name) name = "null_name"; if (!name) name = "null_name";
if (!signature) signature = "null_signature"; if (!signature) signature = "null_signature";
res_len += strlen (klass) + strlen (name) + strlen (signature); return r_str_newf ("%s %s.%s", signature, klass, name);
res = malloc (res_len);
if (res) snprintf (res, res_len, fmt, signature, klass, name);
return res;
} }
R_API DsoJsonObj * r_bin_java_get_fm_type_definition_json (RBinJavaObj *bin, RBinJavaField *fm_type, int is_method) { R_API DsoJsonObj * r_bin_java_get_fm_type_definition_json (RBinJavaObj *bin, RBinJavaField *fm_type, int is_method) {
char *prototype = NULL, ut64 addr = UT64_MAX;
*fq_name = NULL; char *prototype = NULL, *fq_name = NULL;
bool is_native = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_NATIVE) != 0);
ut64 addr = -1; bool is_static = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_STATIC) != 0);
int is_native = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_NATIVE) != 0), bool is_synthetic = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_SYNTHETIC) != 0);
is_static = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_STATIC) != 0), bool is_private = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_PRIVATE) != 0);
is_synthetic = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_SYNTHETIC) != 0), bool is_public = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_PUBLIC) != 0);
is_private = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_PRIVATE) != 0), bool is_protected = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_PROTECTED) != 0);
is_public = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_PUBLIC) != 0), bool is_super = ((fm_type->flags & R_BIN_JAVA_CLASS_ACC_SUPER) != 0);
is_protected = ((fm_type->flags & R_BIN_JAVA_METHOD_ACC_PROTECTED) != 0),
is_super = ((fm_type->flags & R_BIN_JAVA_CLASS_ACC_SUPER) != 0);
DsoJsonObj *fm_type_dict = dso_json_dict_new (); DsoJsonObj *fm_type_dict = dso_json_dict_new ();
dso_json_dict_insert_str_key_num (fm_type_dict, "access_flags", fm_type->flags); dso_json_dict_insert_str_key_num (fm_type_dict, "access_flags", fm_type->flags);
@ -887,7 +879,7 @@ R_API DsoJsonObj * r_bin_java_get_fm_type_definition_json (RBinJavaObj *bin, RBi
addr = r_bin_java_get_method_code_offset (fm_type); addr = r_bin_java_get_method_code_offset (fm_type);
if (addr == 0) addr = fm_type->file_offset; if (addr == 0) addr = fm_type->file_offset;
addr += + bin->loadaddr; addr += bin->loadaddr;
dso_json_dict_insert_str_key_num (fm_type_dict, "addr", addr); dso_json_dict_insert_str_key_num (fm_type_dict, "addr", addr);
dso_json_dict_insert_str_key_num (fm_type_dict, "offset", fm_type->file_offset+bin->loadaddr); dso_json_dict_insert_str_key_num (fm_type_dict, "offset", fm_type->file_offset+bin->loadaddr);
@ -907,13 +899,11 @@ R_API DsoJsonObj * r_bin_java_get_fm_type_definition_json (RBinJavaObj *bin, RBi
} }
R_API char * r_bin_java_get_method_definition(RBinJavaField *fm_type) { R_API char * r_bin_java_get_method_definition(RBinJavaField *fm_type) {
char * prototype = r_bin_java_unmangle (fm_type->flags_str, fm_type->name, fm_type->descriptor); return r_bin_java_unmangle (fm_type->flags_str, fm_type->name, fm_type->descriptor);
return prototype;
} }
R_API char * r_bin_java_get_field_definition(RBinJavaField *fm_type) { R_API char * r_bin_java_get_field_definition(RBinJavaField *fm_type) {
char * prototype = r_bin_java_unmangle (fm_type->flags_str, fm_type->name, fm_type->descriptor); return r_bin_java_unmangle (fm_type->flags_str, fm_type->name, fm_type->descriptor);
return prototype;
} }
R_API DsoJsonObj * r_bin_java_get_method_json_definition(RBinJavaObj *bin, RBinJavaField *fm_type) { R_API DsoJsonObj * r_bin_java_get_method_json_definition(RBinJavaObj *bin, RBinJavaField *fm_type) {
@ -924,7 +914,6 @@ R_API DsoJsonObj * r_bin_java_get_field_json_definition(RBinJavaObj *bin, RBinJa
return r_bin_java_get_fm_type_definition_json (bin, fm_type, 0); return r_bin_java_get_fm_type_definition_json (bin, fm_type, 0);
} }
R_API int r_bin_java_extract_reference_name (const char * input_str, char ** ref_str, ut8 array_cnt) { R_API int r_bin_java_extract_reference_name (const char * input_str, char ** ref_str, ut8 array_cnt) {
char *new_str = NULL; char *new_str = NULL;
ut32 str_len = array_cnt ? (array_cnt+1) * 2: 0 ; ut32 str_len = array_cnt ? (array_cnt+1) * 2: 0 ;
@ -951,15 +940,15 @@ R_API int r_bin_java_extract_reference_name (const char * input_str, char ** ref
if (*new_str == '/') *new_str = '.'; if (*new_str == '/') *new_str = '.';
new_str ++; new_str ++;
} }
return len+2; return len + 2;
} }
R_API void UNUSED_FUNCTION(r_bin_java_print_prototypes) (RBinJavaObj *bin) { R_API void UNUSED_FUNCTION(r_bin_java_print_prototypes) (RBinJavaObj *bin) {
RList * the_list = r_bin_java_get_method_definitions (bin); RList *the_list = r_bin_java_get_method_definitions (bin);
char * str = NULL;
RListIter *iter; RListIter *iter;
char *str;
r_list_foreach (the_list, iter, str) { r_list_foreach (the_list, iter, str) {
eprintf("%s;\n", str); eprintf ("%s;\n", str);
} }
r_list_free (the_list); r_list_free (the_list);
} }
@ -979,13 +968,15 @@ R_API int extract_type_value (const char *arg_str, char **output) {
ut8 found_one = 0, array_cnt = 0; ut8 found_one = 0, array_cnt = 0;
ut32 len = 0, consumed = 0; ut32 len = 0, consumed = 0;
char *str = NULL; char *str = NULL;
if (output == NULL) { if (!arg_str || !output) {
return 0; return 0;
} else if (output && *output && *output != NULL) { }
free(*output); if (output && *output && *output != NULL) {
free (*output);
*output = NULL; *output = NULL;
} }
while (arg_str && *arg_str && !found_one) { while (arg_str && *arg_str && !found_one) {
len = 0;
// handle the end of an object // handle the end of an object
switch (*arg_str) { switch (*arg_str) {
case 'V': case 'V':
@ -1039,7 +1030,9 @@ R_API int extract_type_value (const char *arg_str, char **output) {
break; break;
case '(': len = 1; str = strdup ("("); break; case '(': len = 1; str = strdup ("("); break;
case ')': len = 1; str = strdup (")"); break; case ')': len = 1; str = strdup (")"); break;
default : break; default :
eprintf ("Invalid char '%c' in '%s'\n", *arg_str, arg_str);
return 0;
} }
if (len<1) if (len<1)
break; break;
@ -1064,6 +1057,7 @@ R_API RList * r_bin_java_extract_type_values(const char *arg_str) {
while (str_cur_pos && *str_cur_pos) { while (str_cur_pos && *str_cur_pos) {
// handle the end of an object // handle the end of an object
len = extract_type_value (str_cur_pos, &str); len = extract_type_value (str_cur_pos, &str);
if (len<1) return NULL;
str_cur_pos += len; str_cur_pos += len;
r_list_append (list_args, str); r_list_append (list_args, str);
str = NULL; str = NULL;
@ -2030,9 +2024,9 @@ R_API RBinJavaAttrInfo* r_bin_java_read_next_attr_from_buffer (ut8 *buffer, st64
type_info = r_bin_java_get_attr_type_by_name (name); type_info = r_bin_java_get_attr_type_by_name (name);
if (type_info) { if (type_info) {
IFDBG eprintf ("Typeinfo: %s, was %s\n", type_info->name, name); IFDBG eprintf ("Typeinfo: %s, was %s\n", type_info->name, name);
if (nsz>sz)nsz = sz; //printf ("SZ %d %d %d\n", nsz, sz, buf_offset);
attr = type_info->allocs->new_obj (buffer, nsz, buf_offset); if (nsz>sz) nsz = sz;
if (attr) { if ((attr = type_info->allocs->new_obj (buffer, nsz, buf_offset))) {
attr->metas->ord = (R_BIN_JAVA_GLOBAL_BIN->attr_idx++); attr->metas->ord = (R_BIN_JAVA_GLOBAL_BIN->attr_idx++);
} }
} else { } else {
@ -3625,8 +3619,8 @@ R_API RBinJavaAttrInfo* r_bin_java_line_number_table_attr_new (ut8 *buffer, ut64
} }
for (i = 0; i < attr->info.line_number_table_attr.line_number_table_length; i++) { for (i = 0; i < attr->info.line_number_table_attr.line_number_table_length; i++) {
cur_location = buf_offset + offset; cur_location = buf_offset + offset;
if (cur_location + 8 >= sz) // printf ("%llx %llx \n", cur_location, sz);
break; //if (cur_location + 8 >= sz) break;
lnattr = R_NEW0 (RBinJavaLineNumberAttribute); lnattr = R_NEW0 (RBinJavaLineNumberAttribute);
if (!lnattr) { if (!lnattr) {
perror ("r_bin_java_line_number_table_attr_new"); perror ("r_bin_java_line_number_table_attr_new");
@ -7780,7 +7774,8 @@ R_API RList * r_bin_java_extract_all_bin_type_values(RBinJavaObj * bin_obj) {
// get all field types // get all field types
r_list_foreach (bin_obj->fields_list, fm_type_iter, fm_type) { r_list_foreach (bin_obj->fields_list, fm_type_iter, fm_type) {
char *desc = NULL; char *desc = NULL;
extract_type_value (fm_type->descriptor, &desc); if (!extract_type_value (fm_type->descriptor, &desc))
return NULL;
IFDBG eprintf ("Adding field type: %s\n", desc); IFDBG eprintf ("Adding field type: %s\n", desc);
r_list_append (all_types, desc); r_list_append (all_types, desc);
} }