@@ -67,24 +67,17 @@ int build_id__mark_dso_hit(const struct perf_tool *tool __maybe_unused,
6767 return 0 ;
6868}
6969
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 )
7171{
72- char * bid = bf ;
73- const u8 * raw = build_id -> data ;
74- size_t i ;
75-
76- bf [0 ] = 0x0 ;
72+ size_t offs = 0 ;
7773
78- for (i = 0 ; i < build_id -> size ; ++ i ) {
79- sprintf (bid , "%02x" , * raw );
80- ++ raw ;
81- bid += 2 ;
82- }
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 ]);
8376
84- return ( bid - bf ) + 1 ;
77+ return offs ;
8578}
8679
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 )
8881{
8982 char notes [PATH_MAX ];
9083 struct build_id bid ;
@@ -99,10 +92,10 @@ int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id)
9992 if (ret < 0 )
10093 return ret ;
10194
102- return build_id__sprintf (& bid , sbuild_id );
95+ return build_id__snprintf (& bid , sbuild_id , sbuild_id_size );
10396}
10497
105- int filename__sprintf_build_id (const char * pathname , char * sbuild_id )
98+ int filename__snprintf_build_id (const char * pathname , char * sbuild_id , size_t sbuild_id_size )
10699{
107100 struct build_id bid ;
108101 int ret ;
@@ -111,7 +104,7 @@ int filename__sprintf_build_id(const char *pathname, char *sbuild_id)
111104 if (ret < 0 )
112105 return ret ;
113106
114- return build_id__sprintf (& bid , sbuild_id );
107+ return build_id__snprintf (& bid , sbuild_id , sbuild_id_size );
115108}
116109
117110/* asnprintf consolidates asprintf and snprintf */
@@ -212,9 +205,9 @@ static bool build_id_cache__valid_id(char *sbuild_id)
212205 return false;
213206
214207 if (!strcmp (pathname , DSO__NAME_KALLSYMS ))
215- ret = sysfs__sprintf_build_id ("/" , real_sbuild_id );
208+ ret = sysfs__snprintf_build_id ("/" , real_sbuild_id , sizeof ( real_sbuild_id ) );
216209 else if (pathname [0 ] == '/' )
217- ret = filename__sprintf_build_id (pathname , real_sbuild_id );
210+ ret = filename__snprintf_build_id (pathname , real_sbuild_id , sizeof ( real_sbuild_id ) );
218211 else
219212 ret = - EINVAL ; /* Should we support other special DSO cache? */
220213 if (ret >= 0 )
@@ -243,7 +236,7 @@ char *__dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
243236 if (!dso__has_build_id (dso ))
244237 return NULL ;
245238
246- build_id__sprintf (dso__bid_const (dso ), sbuild_id );
239+ build_id__snprintf (dso__bid_const (dso ), sbuild_id , sizeof ( sbuild_id ) );
247240 linkname = build_id_cache__linkname (sbuild_id , NULL , 0 );
248241 if (!linkname )
249242 return NULL ;
@@ -769,7 +762,7 @@ static int build_id_cache__add_b(const struct build_id *bid,
769762{
770763 char sbuild_id [SBUILD_ID_SIZE ];
771764
772- build_id__sprintf (bid , sbuild_id );
765+ build_id__snprintf (bid , sbuild_id , sizeof ( sbuild_id ) );
773766
774767 return __build_id_cache__add_s (sbuild_id , name , nsi , is_kallsyms ,
775768 is_vdso , proper_name , root_dir );
0 commit comments