Skip to content

Commit b5ba30d

Browse files
committed
Make bar generation bound-safe
This replaces strncat-based appends in gen_hist_bar with bounded memcpy while tracking remaining capacity and always NUL-terminating.
1 parent f29a741 commit b5ba30d

File tree

1 file changed

+37
-7
lines changed

1 file changed

+37
-7
lines changed

tools/rv_histogram.c

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,20 +125,50 @@ static char *gen_hist_bar(char *hist_bar,
125125
unsigned short used_col)
126126
{
127127
#if defined(_WIN32)
128-
size_t v = insn_freq * (max_col - used_col) / max_insn_freq;
128+
size_t v =
129+
max_insn_freq ? insn_freq * (max_col - used_col) / max_insn_freq : 0;
129130
for (size_t i = 0; i < v; i++) {
130131
hist_bar[i] = '*';
131132
}
132133
hist_bar[v] = 0;
133134
#else
134135
const char *a[] = {" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"};
135-
size_t v = insn_freq * (max_col - used_col) * 8 / max_insn_freq;
136-
hist_bar[0] = '\0';
137-
while (v > 8) {
138-
strncat(hist_bar, a[8], hist_bar_len--);
139-
v -= 8;
136+
size_t units = max_insn_freq
137+
? insn_freq * (max_col - used_col) * 8 / max_insn_freq
138+
: 0;
139+
size_t full = units / 8; /* count of full blocks */
140+
size_t rem = units % 8; /* remainder block index */
141+
142+
char *p = hist_bar;
143+
size_t remaining = hist_bar_len;
144+
145+
if (remaining == 0)
146+
return hist_bar;
147+
148+
/* Append full blocks safely */
149+
for (size_t i = 0; i < full; i++) {
150+
const char *blk = a[8];
151+
size_t glyph_len = strlen(blk); /* UTF-8, typically 3 bytes */
152+
if (glyph_len + 1 > remaining)
153+
break; /* not enough space for this glyph + NUL */
154+
memcpy(p, blk, glyph_len);
155+
p += glyph_len;
156+
remaining -= glyph_len;
140157
}
141-
strncat(hist_bar, a[v], hist_bar_len--);
158+
159+
/* Append remainder block if any */
160+
if (rem > 0) {
161+
const char *blk = a[rem];
162+
size_t glyph_len = strlen(blk);
163+
if (glyph_len + 1 <= remaining) {
164+
memcpy(p, blk, glyph_len);
165+
p += glyph_len;
166+
remaining -= glyph_len;
167+
}
168+
}
169+
170+
/* NUL-terminate */
171+
*p = '\0';
142172
#endif
143173

144174
return hist_bar;

0 commit comments

Comments
 (0)