Fix spacing bugs when parsing the calling convention signatures (#17651) ##types

This commit is contained in:
pancake 2020-09-16 19:17:54 +02:00 committed by GitHub
parent 413437e2b6
commit f15f1af521
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 91 additions and 30 deletions

View File

@ -15,40 +15,53 @@ R_API void r_anal_cc_del(RAnal *anal, const char *name) {
}
}
R_API void r_anal_cc_set(RAnal *anal, const char *expr) {
R_API bool r_anal_cc_set(RAnal *anal, const char *expr) {
char *e = strdup (expr);
char *p = strchr (e, '(');
if (p) {
*p++ = 0;
if (!p) {
free (e);
return false;
}
*p++ = 0;
char *args = strdup (p);
r_str_trim (p);
char *end = strchr (args, ')');
if (end) {
*end++ = 0;
RList *retName = r_str_split_list (e, " ", 0);
RList *ccArgs = r_str_split_list (args, ",", 0);
if (r_list_length (retName) == 2) {
const char *ret = r_list_get_n (retName, 0);
const char *name = r_list_get_n (retName, 1);
sdb_set (DB, name, "cc", 0);
sdb_set (DB, sdb_fmt ("cc.%s.ret", name), ret, 0);
RListIter *iter;
const char *arg;
int n = 0;
r_list_foreach (ccArgs, iter, arg) {
if (!strcmp (arg, "stack")) {
sdb_set (DB, sdb_fmt ("cc.%s.argn", name), arg, 0);
} else {
sdb_set (DB, sdb_fmt ("cc.%s.arg%d", name, n), arg, 0);
n++;
}
}
}
r_list_free (retName);
r_list_free (ccArgs);
if (!end) {
free (args);
free (e);
return false;
}
*end++ = 0;
r_str_trim (p);
r_str_trim (e);
char *ccname = strchr (e, ' ');
if (ccname) {
*ccname++ = 0;
r_str_trim (ccname);
} else {
free (args);
free (e);
return false;
}
sdb_set (DB, ccname, "cc", 0);
sdb_set (DB, sdb_fmt ("cc.%s.ret", ccname), e, 0);
RList *ccArgs = r_str_split_list (args, ",", 0);
RListIter *iter;
const char *arg;
int n = 0;
r_list_foreach (ccArgs, iter, arg) {
if (!strcmp (arg, "stack")) {
sdb_set (DB, sdb_fmt ("cc.%s.argn", ccname), arg, 0);
} else {
sdb_set (DB, sdb_fmt ("cc.%s.arg%d", ccname, n), arg, 0);
n++;
}
}
r_list_free (ccArgs);
free (e);
free (args);
return true;
}
R_API char *r_anal_cc_get(RAnal *anal, const char *name) {
@ -92,7 +105,6 @@ R_API char *r_anal_cc_get(RAnal *anal, const char *name) {
return r_strbuf_drain (sb);
}
R_API bool r_anal_cc_exist(RAnal *anal, const char *convention) {
r_return_val_if_fail (anal && convention, false);
const char *x = sdb_const_get (DB, convention, 0);

View File

@ -262,9 +262,12 @@ static void __core_cmd_tcc(RCore *core, const char *input) {
break;
case ' ':
if (strchr (input, '(')) {
r_anal_cc_set (core->anal, input + 1);
if (!r_anal_cc_set (core->anal, input + 1)) {
eprintf ("Invalid syntax in cc signature.");
}
} else {
char *cc = r_anal_cc_get (core->anal, input + 1);
const char *ccname = r_str_trim_head_ro (input + 1);
char *cc = r_anal_cc_get (core->anal, ccname);
if (cc) {
r_cons_printf ("%s\n", cc);
free (cc);

View File

@ -1786,7 +1786,7 @@ R_API R_DEPRECATE RList/*<RAnalVarField *>*/ *r_anal_function_get_var_fields(RAn
// calling conventions API
R_API bool r_anal_cc_exist(RAnal *anal, const char *convention);
R_API void r_anal_cc_del(RAnal *anal, const char *name);
R_API void r_anal_cc_set(RAnal *anal, const char *expr);
R_API bool r_anal_cc_set(RAnal *anal, const char *expr);
R_API char *r_anal_cc_get(RAnal *anal, const char *name);
R_API const char *r_anal_cc_arg(RAnal *anal, const char *convention, int n);
R_API const char *r_anal_cc_self(RAnal *anal, const char *convention);

View File

@ -25,3 +25,49 @@ tfc rax ms (rcx, rdx, r8, r9, stack);
tfc rax swift (rdi, rsi, rdx, rcx, r8, r9, xmm0, xmm1, xmm2, xmm3, xmm4, r13, r12);
EOF
RUN
NAME=tcc
FILE=-
CMDS=<<EOF
e asm.arch=x86
e asm.bits=32
?e 1
"tcc eax jeje(ebx, ecx)"
tcc jeje
tcc- jeje
?e 2
"tcc eax jeje(ebx, ecx)"
tcc jeje
tcc- jeje
?e 3
"tcc eax jeje (ebx, ecx)"
tcc jeje
tcc- jeje
?e 4
"tcc eax jeje (ebx, ecx)"
tcc jeje
tcc- jeje
?e 5
"tcc eax jeje ( ebx, ecx )"
tcc jeje
tcc- jeje
?e 6
"tcc eax jeje ( ebx , ecx )"
tcc jeje
tcc- jeje
EOF
EXPECT=<<EOF
1
eax jeje (ebx, ecx);
2
eax jeje (ebx, ecx);
3
eax jeje (ebx, ecx);
4
eax jeje (ebx, ecx);
5
eax jeje (ebx, ecx);
6
eax jeje (ebx, ecx);
EOF
RUN