Commit fccaaf6f authored by Ian Rogers's avatar Ian Rogers Committed by Namhyung Kim
Browse files

perf build-id: Change sprintf functions to snprintf



Pass in a size argument rather than implying all build id strings must
be SBUILD_ID_SIZE.

Signed-off-by: default avatarIan Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250724163302.596743-4-irogers@google.com


[ fixed some build errors ]
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent 5a2ceebd
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@
#include <linux/string.h>
#include <linux/err.h>

static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuildid)
static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuildid, size_t sbuildid_size)
{
	char root_dir[PATH_MAX];
	char *p;
@@ -42,7 +42,7 @@ static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuildid)
	if (!p)
		return -1;
	*p = '\0';
	return sysfs__sprintf_build_id(root_dir, sbuildid);
	return sysfs__snprintf_build_id(root_dir, sbuildid, sbuildid_size);
}

static int build_id_cache__kcore_dir(char *dir, size_t sz)
@@ -128,7 +128,7 @@ static int build_id_cache__add_kcore(const char *filename, bool force)
		return -1;
	*p = '\0';

	if (build_id_cache__kcore_buildid(from_dir, sbuildid) < 0)
	if (build_id_cache__kcore_buildid(from_dir, sbuildid, sizeof(sbuildid)) < 0)
		return -1;

	scnprintf(to_dir, sizeof(to_dir), "%s/%s/%s",
@@ -187,7 +187,7 @@ static int build_id_cache__add_file(const char *filename, struct nsinfo *nsi)
		return -1;
	}

	build_id__sprintf(&bid, sbuild_id);
	build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id));
	err = build_id_cache__add_s(sbuild_id, filename, nsi,
				    false, false);
	pr_debug("Adding %s %s: %s\n", sbuild_id, filename,
@@ -211,7 +211,7 @@ static int build_id_cache__remove_file(const char *filename, struct nsinfo *nsi)
		return -1;
	}

	build_id__sprintf(&bid, sbuild_id);
	build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id));
	err = build_id_cache__remove_s(sbuild_id);
	pr_debug("Removing %s %s: %s\n", sbuild_id, filename,
		 err ? "FAIL" : "Ok");
@@ -317,7 +317,7 @@ static int build_id_cache__update_file(const char *filename, struct nsinfo *nsi)
	}
	err = 0;

	build_id__sprintf(&bid, sbuild_id);
	build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id));
	if (build_id_cache__cached(sbuild_id))
		err = build_id_cache__remove_s(sbuild_id);

+3 −3
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ static int buildid__map_cb(struct map *map, void *arg __maybe_unused)

	memset(bid_buf, 0, sizeof(bid_buf));
	if (dso__has_build_id(dso))
		build_id__sprintf(dso__bid_const(dso), bid_buf);
		build_id__snprintf(dso__bid_const(dso), bid_buf, sizeof(bid_buf));
	printf("%s %16" PRIx64 " %16" PRIx64, bid_buf, map__start(map), map__end(map));
	if (dso_long_name != NULL)
		printf(" %s", dso_long_name);
@@ -57,7 +57,7 @@ static int sysfs__fprintf_build_id(FILE *fp)
	char sbuild_id[SBUILD_ID_SIZE];
	int ret;

	ret = sysfs__sprintf_build_id("/", sbuild_id);
	ret = sysfs__snprintf_build_id("/", sbuild_id, sizeof(sbuild_id));
	if (ret != sizeof(sbuild_id))
		return ret < 0 ? ret : -EINVAL;

@@ -69,7 +69,7 @@ static int filename__fprintf_build_id(const char *name, FILE *fp)
	char sbuild_id[SBUILD_ID_SIZE];
	int ret;

	ret = filename__sprintf_build_id(name, sbuild_id);
	ret = filename__snprintf_build_id(name, sbuild_id, sizeof(sbuild_id));
	if (ret != sizeof(sbuild_id))
		return ret < 0 ? ret : -EINVAL;

+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ static int build_id_cache__add_file(const char *filename)
		return err;
	}

	build_id__sprintf(&bid, sbuild_id);
	build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id));
	err = build_id_cache__add_s(sbuild_id, filename, NULL, false, false);
	if (err < 0)
		pr_debug("Failed to add build id cache of %s\n", filename);
+13 −20
Original line number Diff line number Diff line
@@ -67,24 +67,17 @@ int build_id__mark_dso_hit(const struct perf_tool *tool __maybe_unused,
	return 0;
}

int build_id__sprintf(const struct build_id *build_id, char *bf)
int build_id__snprintf(const struct build_id *build_id, char *bf, size_t bf_size)
{
	char *bid = bf;
	const u8 *raw = build_id->data;
	size_t i;

	bf[0] = 0x0;
	size_t offs = 0;

	for (i = 0; i < build_id->size; ++i) {
		sprintf(bid, "%02x", *raw);
		++raw;
		bid += 2;
	}
	for (size_t i = 0; i < build_id->size && offs < bf_size; ++i)
		offs += snprintf(bf + offs, bf_size - offs, "%02x", build_id->data[i]);

	return (bid - bf) + 1;
	return offs;
}

int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id)
int sysfs__snprintf_build_id(const char *root_dir, char *sbuild_id, size_t sbuild_id_size)
{
	char notes[PATH_MAX];
	struct build_id bid;
@@ -99,10 +92,10 @@ int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id)
	if (ret < 0)
		return ret;

	return build_id__sprintf(&bid, sbuild_id);
	return build_id__snprintf(&bid, sbuild_id, sbuild_id_size);
}

int filename__sprintf_build_id(const char *pathname, char *sbuild_id)
int filename__snprintf_build_id(const char *pathname, char *sbuild_id, size_t sbuild_id_size)
{
	struct build_id bid;
	int ret;
@@ -111,7 +104,7 @@ int filename__sprintf_build_id(const char *pathname, char *sbuild_id)
	if (ret < 0)
		return ret;

	return build_id__sprintf(&bid, sbuild_id);
	return build_id__snprintf(&bid, sbuild_id, sbuild_id_size);
}

/* asnprintf consolidates asprintf and snprintf */
@@ -212,9 +205,9 @@ static bool build_id_cache__valid_id(char *sbuild_id)
		return false;

	if (!strcmp(pathname, DSO__NAME_KALLSYMS))
		ret = sysfs__sprintf_build_id("/", real_sbuild_id);
		ret = sysfs__snprintf_build_id("/", real_sbuild_id, sizeof(real_sbuild_id));
	else if (pathname[0] == '/')
		ret = filename__sprintf_build_id(pathname, real_sbuild_id);
		ret = filename__snprintf_build_id(pathname, real_sbuild_id, sizeof(real_sbuild_id));
	else
		ret = -EINVAL;	/* Should we support other special DSO cache? */
	if (ret >= 0)
@@ -243,7 +236,7 @@ char *__dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
	if (!dso__has_build_id(dso))
		return NULL;

	build_id__sprintf(dso__bid_const(dso), sbuild_id);
	build_id__snprintf(dso__bid_const(dso), sbuild_id, sizeof(sbuild_id));
	linkname = build_id_cache__linkname(sbuild_id, NULL, 0);
	if (!linkname)
		return NULL;
@@ -769,7 +762,7 @@ static int build_id_cache__add_b(const struct build_id *bid,
{
	char sbuild_id[SBUILD_ID_SIZE];

	build_id__sprintf(bid, sbuild_id);
	build_id__snprintf(bid, sbuild_id, sizeof(sbuild_id));

	return __build_id_cache__add_s(sbuild_id, name, nsi, is_kallsyms,
				       is_vdso, proper_name, root_dir);
+3 −3
Original line number Diff line number Diff line
@@ -21,10 +21,10 @@ struct feat_fd;
struct nsinfo;

void build_id__init(struct build_id *bid, const u8 *data, size_t size);
int build_id__sprintf(const struct build_id *build_id, char *bf);
int build_id__snprintf(const struct build_id *build_id, char *bf, size_t bf_size);
bool build_id__is_defined(const struct build_id *bid);
int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id);
int filename__sprintf_build_id(const char *pathname, char *sbuild_id);
int sysfs__snprintf_build_id(const char *root_dir, char *sbuild_id, size_t sbuild_id_size);
int filename__snprintf_build_id(const char *pathname, char *sbuild_id, size_t sbuild_id_size);
char *build_id_cache__kallsyms_path(const char *sbuild_id, char *bf,
				    size_t size);

Loading