Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250724163302.596743-4-irogers@google.com
[ fixed some build errors ]
Signed-off-by: Namhyung Kim <namhyung@kernel.org>

authored by

Ian Rogers and committed by
Namhyung Kim
fccaaf6f 5a2ceebd

+42 -50
+6 -6
tools/perf/builtin-buildid-cache.c
··· 31 31 #include <linux/string.h> 32 32 #include <linux/err.h> 33 33 34 - static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuildid) 34 + static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuildid, size_t sbuildid_size) 35 35 { 36 36 char root_dir[PATH_MAX]; 37 37 char *p; ··· 42 42 if (!p) 43 43 return -1; 44 44 *p = '\0'; 45 - return sysfs__sprintf_build_id(root_dir, sbuildid); 45 + return sysfs__snprintf_build_id(root_dir, sbuildid, sbuildid_size); 46 46 } 47 47 48 48 static int build_id_cache__kcore_dir(char *dir, size_t sz) ··· 128 128 return -1; 129 129 *p = '\0'; 130 130 131 - if (build_id_cache__kcore_buildid(from_dir, sbuildid) < 0) 131 + if (build_id_cache__kcore_buildid(from_dir, sbuildid, sizeof(sbuildid)) < 0) 132 132 return -1; 133 133 134 134 scnprintf(to_dir, sizeof(to_dir), "%s/%s/%s", ··· 187 187 return -1; 188 188 } 189 189 190 - build_id__sprintf(&bid, sbuild_id); 190 + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); 191 191 err = build_id_cache__add_s(sbuild_id, filename, nsi, 192 192 false, false); 193 193 pr_debug("Adding %s %s: %s\n", sbuild_id, filename, ··· 211 211 return -1; 212 212 } 213 213 214 - build_id__sprintf(&bid, sbuild_id); 214 + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); 215 215 err = build_id_cache__remove_s(sbuild_id); 216 216 pr_debug("Removing %s %s: %s\n", sbuild_id, filename, 217 217 err ? "FAIL" : "Ok"); ··· 317 317 } 318 318 err = 0; 319 319 320 - build_id__sprintf(&bid, sbuild_id); 320 + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); 321 321 if (build_id_cache__cached(sbuild_id)) 322 322 err = build_id_cache__remove_s(sbuild_id); 323 323
+3 -3
tools/perf/builtin-buildid-list.c
··· 31 31 32 32 memset(bid_buf, 0, sizeof(bid_buf)); 33 33 if (dso__has_build_id(dso)) 34 - build_id__sprintf(dso__bid_const(dso), bid_buf); 34 + build_id__snprintf(dso__bid_const(dso), bid_buf, sizeof(bid_buf)); 35 35 printf("%s %16" PRIx64 " %16" PRIx64, bid_buf, map__start(map), map__end(map)); 36 36 if (dso_long_name != NULL) 37 37 printf(" %s", dso_long_name); ··· 57 57 char sbuild_id[SBUILD_ID_SIZE]; 58 58 int ret; 59 59 60 - ret = sysfs__sprintf_build_id("/", sbuild_id); 60 + ret = sysfs__snprintf_build_id("/", sbuild_id, sizeof(sbuild_id)); 61 61 if (ret != sizeof(sbuild_id)) 62 62 return ret < 0 ? ret : -EINVAL; 63 63 ··· 69 69 char sbuild_id[SBUILD_ID_SIZE]; 70 70 int ret; 71 71 72 - ret = filename__sprintf_build_id(name, sbuild_id); 72 + ret = filename__snprintf_build_id(name, sbuild_id, sizeof(sbuild_id)); 73 73 if (ret != sizeof(sbuild_id)) 74 74 return ret < 0 ? ret : -EINVAL; 75 75
+1 -1
tools/perf/tests/sdt.c
··· 37 37 return err; 38 38 } 39 39 40 - build_id__sprintf(&bid, sbuild_id); 40 + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); 41 41 err = build_id_cache__add_s(sbuild_id, filename, NULL, false, false); 42 42 if (err < 0) 43 43 pr_debug("Failed to add build id cache of %s\n", filename);
+13 -20
tools/perf/util/build-id.c
··· 67 67 return 0; 68 68 } 69 69 70 - int build_id__sprintf(const struct build_id *build_id, char *bf) 70 + int build_id__snprintf(const struct build_id *build_id, char *bf, size_t bf_size) 71 71 { 72 - char *bid = bf; 73 - const u8 *raw = build_id->data; 74 - size_t i; 72 + size_t offs = 0; 75 73 76 - bf[0] = 0x0; 74 + for (size_t i = 0; i < build_id->size && offs < bf_size; ++i) 75 + offs += snprintf(bf + offs, bf_size - offs, "%02x", build_id->data[i]); 77 76 78 - for (i = 0; i < build_id->size; ++i) { 79 - sprintf(bid, "%02x", *raw); 80 - ++raw; 81 - bid += 2; 82 - } 83 - 84 - return (bid - bf) + 1; 77 + return offs; 85 78 } 86 79 87 - int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id) 80 + int sysfs__snprintf_build_id(const char *root_dir, char *sbuild_id, size_t sbuild_id_size) 88 81 { 89 82 char notes[PATH_MAX]; 90 83 struct build_id bid; ··· 92 99 if (ret < 0) 93 100 return ret; 94 101 95 - return build_id__sprintf(&bid, sbuild_id); 102 + return build_id__snprintf(&bid, sbuild_id, sbuild_id_size); 96 103 } 97 104 98 - int filename__sprintf_build_id(const char *pathname, char *sbuild_id) 105 + int filename__snprintf_build_id(const char *pathname, char *sbuild_id, size_t sbuild_id_size) 99 106 { 100 107 struct build_id bid; 101 108 int ret; ··· 104 111 if (ret < 0) 105 112 return ret; 106 113 107 - return build_id__sprintf(&bid, sbuild_id); 114 + return build_id__snprintf(&bid, sbuild_id, sbuild_id_size); 108 115 } 109 116 110 117 /* asnprintf consolidates asprintf and snprintf */ ··· 205 212 return false; 206 213 207 214 if (!strcmp(pathname, DSO__NAME_KALLSYMS)) 208 - ret = sysfs__sprintf_build_id("/", real_sbuild_id); 215 + ret = sysfs__snprintf_build_id("/", real_sbuild_id, sizeof(real_sbuild_id)); 209 216 else if (pathname[0] == '/') 210 - ret = filename__sprintf_build_id(pathname, real_sbuild_id); 217 + ret = filename__snprintf_build_id(pathname, real_sbuild_id, sizeof(real_sbuild_id)); 211 218 else 212 219 ret = -EINVAL; /* Should we support other special DSO cache? */ 213 220 if (ret >= 0) ··· 236 243 if (!dso__has_build_id(dso)) 237 244 return NULL; 238 245 239 - build_id__sprintf(dso__bid_const(dso), sbuild_id); 246 + build_id__snprintf(dso__bid_const(dso), sbuild_id, sizeof(sbuild_id)); 240 247 linkname = build_id_cache__linkname(sbuild_id, NULL, 0); 241 248 if (!linkname) 242 249 return NULL; ··· 762 769 { 763 770 char sbuild_id[SBUILD_ID_SIZE]; 764 771 765 - build_id__sprintf(bid, sbuild_id); 772 + build_id__snprintf(bid, sbuild_id, sizeof(sbuild_id)); 766 773 767 774 return __build_id_cache__add_s(sbuild_id, name, nsi, is_kallsyms, 768 775 is_vdso, proper_name, root_dir);
+3 -3
tools/perf/util/build-id.h
··· 21 21 struct nsinfo; 22 22 23 23 void build_id__init(struct build_id *bid, const u8 *data, size_t size); 24 - int build_id__sprintf(const struct build_id *build_id, char *bf); 24 + int build_id__snprintf(const struct build_id *build_id, char *bf, size_t bf_size); 25 25 bool build_id__is_defined(const struct build_id *bid); 26 - int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id); 27 - int filename__sprintf_build_id(const char *pathname, char *sbuild_id); 26 + int sysfs__snprintf_build_id(const char *root_dir, char *sbuild_id, size_t sbuild_id_size); 27 + int filename__snprintf_build_id(const char *pathname, char *sbuild_id, size_t sbuild_id_size); 28 28 char *build_id_cache__kallsyms_path(const char *sbuild_id, char *bf, 29 29 size_t size); 30 30
+1 -1
tools/perf/util/disasm.c
··· 1218 1218 char *build_id_msg = NULL; 1219 1219 1220 1220 if (dso__has_build_id(dso)) { 1221 - build_id__sprintf(dso__bid(dso), bf + 15); 1221 + build_id__snprintf(dso__bid(dso), bf + 15, sizeof(bf) - 15); 1222 1222 build_id_msg = bf; 1223 1223 } 1224 1224 scnprintf(buf, buflen,
+2 -2
tools/perf/util/dso.c
··· 217 217 break; 218 218 } 219 219 220 - build_id__sprintf(dso__bid_const(dso), build_id_hex); 220 + build_id__snprintf(dso__bid_const(dso), build_id_hex, sizeof(build_id_hex)); 221 221 len = __symbol__join_symfs(filename, size, "/usr/lib/debug/.build-id/"); 222 222 snprintf(filename + len, size - len, "%.2s/%s.debug", 223 223 build_id_hex, build_id_hex + 2); ··· 1708 1708 { 1709 1709 char sbuild_id[SBUILD_ID_SIZE]; 1710 1710 1711 - build_id__sprintf(dso__bid(dso), sbuild_id); 1711 + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); 1712 1712 return fprintf(fp, "%s", sbuild_id); 1713 1713 } 1714 1714
+1 -1
tools/perf/util/dsos.c
··· 373 373 374 374 if (args->skip && args->skip(dso, args->parm)) 375 375 return 0; 376 - build_id__sprintf(dso__bid(dso), sbuild_id); 376 + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); 377 377 args->ret += fprintf(args->fp, "%-40s %s\n", sbuild_id, dso__long_name(dso)); 378 378 return 0; 379 379 }
+1 -1
tools/perf/util/event.c
··· 334 334 335 335 build_id__init(&bid, event->mmap2.build_id, 336 336 event->mmap2.build_id_size); 337 - build_id__sprintf(&bid, sbuild_id); 337 + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); 338 338 339 339 return fprintf(fp, " %d/%d: [%#" PRI_lx64 "(%#" PRI_lx64 ") @ %#" PRI_lx64 340 340 " <%s>]: %c%c%c%c %s\n",
+1 -1
tools/perf/util/header.c
··· 2303 2303 free(m.name); 2304 2304 } 2305 2305 2306 - build_id__sprintf(dso__bid(dso), sbuild_id); 2306 + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); 2307 2307 pr_debug("build id event received for %s: %s [%zu]\n", 2308 2308 dso__long_name(dso), sbuild_id, size); 2309 2309 dso__put(dso);
+1 -1
tools/perf/util/map.c
··· 354 354 if (dso__has_build_id(dso)) { 355 355 char sbuild_id[SBUILD_ID_SIZE]; 356 356 357 - build_id__sprintf(dso__bid(dso), sbuild_id); 357 + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); 358 358 pr_debug("%s with build id %s not found", name, sbuild_id); 359 359 } else 360 360 pr_debug("Failed to open %s", name);
+2 -2
tools/perf/util/probe-event.c
··· 502 502 if (!c) 503 503 return NULL; 504 504 505 - build_id__sprintf(dso__bid(dso), sbuild_id); 505 + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); 506 506 fd = debuginfod_find_debuginfo(c, (const unsigned char *)sbuild_id, 507 507 0, &path); 508 508 if (fd >= 0) ··· 1089 1089 } 1090 1090 if (dinfo->build_id) { 1091 1091 build_id__init(&bid, dinfo->build_id, BUILD_ID_SIZE); 1092 - build_id__sprintf(&bid, sbuild_id); 1092 + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); 1093 1093 } 1094 1094 debuginfo__delete(dinfo); 1095 1095 if (ret == 0 || ret == -ENOENT) {
+2 -2
tools/perf/util/probe-file.c
··· 448 448 if (!target || !strcmp(target, DSO__NAME_KALLSYMS)) { 449 449 target = DSO__NAME_KALLSYMS; 450 450 is_kallsyms = true; 451 - ret = sysfs__sprintf_build_id("/", sbuildid); 451 + ret = sysfs__snprintf_build_id("/", sbuildid, sizeof(sbuildid)); 452 452 } else { 453 453 nsinfo__mountns_enter(nsi, &nsc); 454 - ret = filename__sprintf_build_id(target, sbuildid); 454 + ret = filename__snprintf_build_id(target, sbuildid, sizeof(sbuildid)); 455 455 nsinfo__mountns_exit(&nsc); 456 456 } 457 457
+1 -1
tools/perf/util/probe-finder.c
··· 859 859 comp_dir = cu_get_comp_dir(&pf->cu_die); 860 860 if (pf->dbg->build_id) { 861 861 build_id__init(&bid, pf->dbg->build_id, BUILD_ID_SIZE); 862 - build_id__sprintf(&bid, sbuild_id); 862 + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); 863 863 } 864 864 ret = find_source_path(pf->fname, sbuild_id, comp_dir, &fpath); 865 865 if (ret < 0) {
+3 -4
tools/perf/util/scripting-engines/trace-event-python.c
··· 780 780 const char *sym_field, const char *symoff_field, 781 781 const char *map_pgoff) 782 782 { 783 - char sbuild_id[SBUILD_ID_SIZE]; 784 - 785 783 if (al->map) { 784 + char sbuild_id[SBUILD_ID_SIZE]; 786 785 struct dso *dso = map__dso(al->map); 787 786 788 787 pydict_set_item_string_decref(dict, dso_field, 789 788 _PyUnicode_FromString(dso__name(dso))); 790 - build_id__sprintf(dso__bid(dso), sbuild_id); 789 + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); 791 790 pydict_set_item_string_decref(dict, dso_bid_field, 792 791 _PyUnicode_FromString(sbuild_id)); 793 792 pydict_set_item_string_decref(dict, dso_map_start, ··· 1237 1238 char sbuild_id[SBUILD_ID_SIZE]; 1238 1239 PyObject *t; 1239 1240 1240 - build_id__sprintf(dso__bid(dso), sbuild_id); 1241 + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); 1241 1242 1242 1243 t = tuple_new(5); 1243 1244
+1 -1
tools/perf/util/symbol.c
··· 2152 2152 goto proc_kallsyms; 2153 2153 } 2154 2154 2155 - build_id__sprintf(dso__bid(dso), sbuild_id); 2155 + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); 2156 2156 2157 2157 /* Find kallsyms in build-id cache with kcore */ 2158 2158 scnprintf(path, sizeof(path), "%s/%s/%s",