mirror of
https://github.com/netdata/libbpf.git
synced 2026-04-03 23:29:06 +08:00
libbpf: Avoid allocating reg_name with sscanf in parse_usdt_arg()
The reg_name in parse_usdt_arg() is used to hold register name, which is short enough to be held in a 16-byte array, so we could define reg_name as char reg_name[16] to avoid dynamically allocating reg_name with sscanf. Suggested-by: Andrii Nakryiko <andrii.nakryiko@gmail.com> Signed-off-by: Xu Kuohai <xukuohai@huawei.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Acked-by: Stanislav Fomichev <sdf@google.com> Link: https://lore.kernel.org/bpf/20221018145538.2046842-1-xukuohai@huaweicloud.com
This commit is contained in:
committed by
Andrii Nakryiko
parent
3cd45b660c
commit
1bb7a8349a
16
src/usdt.c
16
src/usdt.c
@@ -1225,26 +1225,24 @@ static int calc_pt_regs_off(const char *reg_name)
|
|||||||
|
|
||||||
static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg)
|
static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg)
|
||||||
{
|
{
|
||||||
char *reg_name = NULL;
|
char reg_name[16];
|
||||||
int arg_sz, len, reg_off;
|
int arg_sz, len, reg_off;
|
||||||
long off;
|
long off;
|
||||||
|
|
||||||
if (sscanf(arg_str, " %d @ %ld ( %%%m[^)] ) %n", &arg_sz, &off, ®_name, &len) == 3) {
|
if (sscanf(arg_str, " %d @ %ld ( %%%15[^)] ) %n", &arg_sz, &off, reg_name, &len) == 3) {
|
||||||
/* Memory dereference case, e.g., -4@-20(%rbp) */
|
/* Memory dereference case, e.g., -4@-20(%rbp) */
|
||||||
arg->arg_type = USDT_ARG_REG_DEREF;
|
arg->arg_type = USDT_ARG_REG_DEREF;
|
||||||
arg->val_off = off;
|
arg->val_off = off;
|
||||||
reg_off = calc_pt_regs_off(reg_name);
|
reg_off = calc_pt_regs_off(reg_name);
|
||||||
free(reg_name);
|
|
||||||
if (reg_off < 0)
|
if (reg_off < 0)
|
||||||
return reg_off;
|
return reg_off;
|
||||||
arg->reg_off = reg_off;
|
arg->reg_off = reg_off;
|
||||||
} else if (sscanf(arg_str, " %d @ %%%ms %n", &arg_sz, ®_name, &len) == 2) {
|
} else if (sscanf(arg_str, " %d @ %%%15s %n", &arg_sz, reg_name, &len) == 2) {
|
||||||
/* Register read case, e.g., -4@%eax */
|
/* Register read case, e.g., -4@%eax */
|
||||||
arg->arg_type = USDT_ARG_REG;
|
arg->arg_type = USDT_ARG_REG;
|
||||||
arg->val_off = 0;
|
arg->val_off = 0;
|
||||||
|
|
||||||
reg_off = calc_pt_regs_off(reg_name);
|
reg_off = calc_pt_regs_off(reg_name);
|
||||||
free(reg_name);
|
|
||||||
if (reg_off < 0)
|
if (reg_off < 0)
|
||||||
return reg_off;
|
return reg_off;
|
||||||
arg->reg_off = reg_off;
|
arg->reg_off = reg_off;
|
||||||
@@ -1456,16 +1454,15 @@ static int calc_pt_regs_off(const char *reg_name)
|
|||||||
|
|
||||||
static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg)
|
static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg)
|
||||||
{
|
{
|
||||||
char *reg_name = NULL;
|
char reg_name[16];
|
||||||
int arg_sz, len, reg_off;
|
int arg_sz, len, reg_off;
|
||||||
long off;
|
long off;
|
||||||
|
|
||||||
if (sscanf(arg_str, " %d @ %ld ( %m[a-z0-9] ) %n", &arg_sz, &off, ®_name, &len) == 3) {
|
if (sscanf(arg_str, " %d @ %ld ( %15[a-z0-9] ) %n", &arg_sz, &off, reg_name, &len) == 3) {
|
||||||
/* Memory dereference case, e.g., -8@-88(s0) */
|
/* Memory dereference case, e.g., -8@-88(s0) */
|
||||||
arg->arg_type = USDT_ARG_REG_DEREF;
|
arg->arg_type = USDT_ARG_REG_DEREF;
|
||||||
arg->val_off = off;
|
arg->val_off = off;
|
||||||
reg_off = calc_pt_regs_off(reg_name);
|
reg_off = calc_pt_regs_off(reg_name);
|
||||||
free(reg_name);
|
|
||||||
if (reg_off < 0)
|
if (reg_off < 0)
|
||||||
return reg_off;
|
return reg_off;
|
||||||
arg->reg_off = reg_off;
|
arg->reg_off = reg_off;
|
||||||
@@ -1474,12 +1471,11 @@ static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec
|
|||||||
arg->arg_type = USDT_ARG_CONST;
|
arg->arg_type = USDT_ARG_CONST;
|
||||||
arg->val_off = off;
|
arg->val_off = off;
|
||||||
arg->reg_off = 0;
|
arg->reg_off = 0;
|
||||||
} else if (sscanf(arg_str, " %d @ %m[a-z0-9] %n", &arg_sz, ®_name, &len) == 2) {
|
} else if (sscanf(arg_str, " %d @ %15[a-z0-9] %n", &arg_sz, reg_name, &len) == 2) {
|
||||||
/* Register read case, e.g., -8@a1 */
|
/* Register read case, e.g., -8@a1 */
|
||||||
arg->arg_type = USDT_ARG_REG;
|
arg->arg_type = USDT_ARG_REG;
|
||||||
arg->val_off = 0;
|
arg->val_off = 0;
|
||||||
reg_off = calc_pt_regs_off(reg_name);
|
reg_off = calc_pt_regs_off(reg_name);
|
||||||
free(reg_name);
|
|
||||||
if (reg_off < 0)
|
if (reg_off < 0)
|
||||||
return reg_off;
|
return reg_off;
|
||||||
arg->reg_off = reg_off;
|
arg->reg_off = reg_off;
|
||||||
|
|||||||
Reference in New Issue
Block a user