Commit 6e73e683 authored by Andrii Nakryiko's avatar Andrii Nakryiko
Browse files

Merge branch 'Fix bugs found by ASAN when running selftests'

Xu Kuohai says:

====================

From: Xu Kuohai <xukuohai@huawei.com>

This series fixes bugs found by ASAN when running bpf selftests on arm64.

v4:
- Address Andrii's suggestions

v3: https://lore.kernel.org/bpf/5311e154-c2d4-91a5-ccb8-f5adede579ed@huawei.com
- Fix error failure of case test_xdp_adjust_tail_grow exposed by this series

v2: https://lore.kernel.org/bpf/20221010070454.577433-1-xukuohai@huaweicloud.com
- Rebase and fix conflict

v1: https://lore.kernel.org/bpf/20221009131830.395569-1-xukuohai@huaweicloud.com


====================

Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
parents de9c8d84 cbc1c998
Loading
Loading
Loading
Loading
+26 −3
Original line number Diff line number Diff line
@@ -219,6 +219,17 @@ static int btf_dump_resize(struct btf_dump *d)
	return 0;
}

static void btf_dump_free_names(struct hashmap *map)
{
	size_t bkt;
	struct hashmap_entry *cur;

	hashmap__for_each_entry(map, cur, bkt)
		free((void *)cur->key);

	hashmap__free(map);
}

void btf_dump__free(struct btf_dump *d)
{
	int i;
@@ -237,8 +248,8 @@ void btf_dump__free(struct btf_dump *d)
	free(d->cached_names);
	free(d->emit_queue);
	free(d->decl_stack);
	hashmap__free(d->type_names);
	hashmap__free(d->ident_names);
	btf_dump_free_names(d->type_names);
	btf_dump_free_names(d->ident_names);

	free(d);
}
@@ -1524,11 +1535,23 @@ static void btf_dump_emit_type_cast(struct btf_dump *d, __u32 id,
static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map,
				 const char *orig_name)
{
	char *old_name, *new_name;
	size_t dup_cnt = 0;
	int err;

	new_name = strdup(orig_name);
	if (!new_name)
		return 1;

	hashmap__find(name_map, orig_name, (void **)&dup_cnt);
	dup_cnt++;
	hashmap__set(name_map, orig_name, (void *)dup_cnt, NULL, NULL);

	err = hashmap__set(name_map, new_name, (void *)dup_cnt,
			   (const void **)&old_name, NULL);
	if (err)
		free(new_name);

	free(old_name);

	return dup_cnt;
}
+4 −7
Original line number Diff line number Diff line
@@ -1348,25 +1348,23 @@ 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)
{
	char *reg_name = NULL;
	char reg_name[16];
	int arg_sz, len, reg_off;
	long off;

	if (sscanf(arg_str, " %d @ \[ %m[a-z0-9], %ld ] %n", &arg_sz, &reg_name, &off, &len) == 3) {
	if (sscanf(arg_str, " %d @ \[ %15[a-z0-9], %ld ] %n", &arg_sz, reg_name, &off, &len) == 3) {
		/* Memory dereference case, e.g., -4@[sp, 96] */
		arg->arg_type = USDT_ARG_REG_DEREF;
		arg->val_off = off;
		reg_off = calc_pt_regs_off(reg_name);
		free(reg_name);
		if (reg_off < 0)
			return reg_off;
		arg->reg_off = reg_off;
	} else if (sscanf(arg_str, " %d @ \[ %m[a-z0-9] ] %n", &arg_sz, &reg_name, &len) == 2) {
	} else if (sscanf(arg_str, " %d @ \[ %15[a-z0-9] ] %n", &arg_sz, reg_name, &len) == 2) {
		/* Memory dereference case, e.g., -4@[sp] */
		arg->arg_type = USDT_ARG_REG_DEREF;
		arg->val_off = 0;
		reg_off = calc_pt_regs_off(reg_name);
		free(reg_name);
		if (reg_off < 0)
			return reg_off;
		arg->reg_off = reg_off;
@@ -1375,12 +1373,11 @@ static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec
		arg->arg_type = USDT_ARG_CONST;
		arg->val_off = off;
		arg->reg_off = 0;
	} else if (sscanf(arg_str, " %d @ %m[a-z0-9] %n", &arg_sz, &reg_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@x4 */
		arg->arg_type = USDT_ARG_REG;
		arg->val_off = 0;
		reg_off = calc_pt_regs_off(reg_name);
		free(reg_name);
		if (reg_off < 0)
			return reg_off;
		arg->reg_off = reg_off;
+14 −12
Original line number Diff line number Diff line
@@ -325,7 +325,7 @@ static bool symbol_equal(const void *key1, const void *key2, void *ctx __maybe_u
static int get_syms(char ***symsp, size_t *cntp)
{
	size_t cap = 0, cnt = 0, i;
	char *name, **syms = NULL;
	char *name = NULL, **syms = NULL;
	struct hashmap *map;
	char buf[256];
	FILE *f;
@@ -352,6 +352,8 @@ static int get_syms(char ***symsp, size_t *cntp)
		/* skip modules */
		if (strchr(buf, '['))
			continue;

		free(name);
		if (sscanf(buf, "%ms$*[^\n]\n", &name) != 1)
			continue;
		/*
@@ -369,32 +371,32 @@ static int get_syms(char ***symsp, size_t *cntp)
		if (!strncmp(name, "__ftrace_invalid_address__",
			     sizeof("__ftrace_invalid_address__") - 1))
			continue;

		err = hashmap__add(map, name, NULL);
		if (err) {
			free(name);
		if (err == -EEXIST)
			continue;
		if (err)
			goto error;
		}

		err = libbpf_ensure_mem((void **) &syms, &cap,
					sizeof(*syms), cnt + 1);
		if (err) {
			free(name);
		if (err)
			goto error;
		}
		syms[cnt] = name;
		cnt++;

		syms[cnt++] = name;
		name = NULL;
	}

	*symsp = syms;
	*cntp = cnt;

error:
	free(name);
	fclose(f);
	hashmap__free(map);
	if (err) {
		for (i = 0; i < cnt; i++)
			free(syms[cnt]);
			free(syms[i]);
		free(syms);
	}
	return err;
+2 −1
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ static void test_map_kptr_success(bool test_run)
	ASSERT_OK(opts.retval, "test_map_kptr_ref2 retval");

	if (test_run)
		return;
		goto exit;

	ret = bpf_map__update_elem(skel->maps.array_map,
				   &key, sizeof(key), buf, sizeof(buf), 0);
@@ -132,6 +132,7 @@ static void test_map_kptr_success(bool test_run)
	ret = bpf_map__delete_elem(skel->maps.lru_hash_map, &key, sizeof(key), 0);
	ASSERT_OK(ret, "lru_hash_map delete");

exit:
	map_kptr__destroy(skel);
}

+2 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ static void test_fentry(void)

	err = tracing_struct__attach(skel);
	if (!ASSERT_OK(err, "tracing_struct__attach"))
		return;
		goto destroy_skel;

	ASSERT_OK(trigger_module_test_read(256), "trigger_read");

@@ -54,6 +54,7 @@ static void test_fentry(void)
	ASSERT_EQ(skel->bss->t5_ret, 1, "t5 ret");

	tracing_struct__detach(skel);
destroy_skel:
	tracing_struct__destroy(skel);
}

Loading