|
From: <sv...@va...> - 2014-08-02 20:37:17
|
Author: florian
Date: Sat Aug 2 20:37:07 2014
New Revision: 14229
Log:
MC_(snprintf_delta) was invoked with too small a buffer.
Add an assert, change the buffer size and remove some magic
constants along the way.
Modified:
branches/BUF_REMOVAL/memcheck/mc_errors.c
branches/BUF_REMOVAL/memcheck/mc_leakcheck.c
Modified: branches/BUF_REMOVAL/memcheck/mc_errors.c
==============================================================================
--- branches/BUF_REMOVAL/memcheck/mc_errors.c (original)
+++ branches/BUF_REMOVAL/memcheck/mc_errors.c Sat Aug 2 20:37:07 2014
@@ -292,6 +292,12 @@
SizeT current_val, SizeT old_val,
LeakCheckDeltaMode delta_mode)
{
+ // Make sure the buffer size is large enough. With old_val == 0 and
+ // current_val == ULLONG_MAX the delta including inserted commas is:
+ // 18,446,744,073,709,551,615
+ // whose length is 26. Therefore:
+ tl_assert(size >= 26 + 4 + 1);
+
if (delta_mode == LCD_Any)
buf[0] = '\0';
else if (current_val >= old_val)
@@ -307,24 +313,24 @@
{
// char arrays to produce the indication of increase/decrease in case
// of delta_mode != LCD_Any
- HChar d_bytes[20];
- HChar d_direct_bytes[20];
- HChar d_indirect_bytes[20];
- HChar d_num_blocks[20];
+ HChar d_bytes[31];
+ HChar d_direct_bytes[31];
+ HChar d_indirect_bytes[31];
+ HChar d_num_blocks[31];
- MC_(snprintf_delta) (d_bytes, 20,
+ MC_(snprintf_delta) (d_bytes, sizeof(d_bytes),
lr->szB + lr->indirect_szB,
lr->old_szB + lr->old_indirect_szB,
MC_(detect_memory_leaks_last_delta_mode));
- MC_(snprintf_delta) (d_direct_bytes, 20,
+ MC_(snprintf_delta) (d_direct_bytes, sizeof(d_direct_bytes),
lr->szB,
lr->old_szB,
MC_(detect_memory_leaks_last_delta_mode));
- MC_(snprintf_delta) (d_indirect_bytes, 20,
+ MC_(snprintf_delta) (d_indirect_bytes, sizeof(d_indirect_bytes),
lr->indirect_szB,
lr->old_indirect_szB,
MC_(detect_memory_leaks_last_delta_mode));
- MC_(snprintf_delta) (d_num_blocks, 20,
+ MC_(snprintf_delta) (d_num_blocks, sizeof(d_num_blocks),
(SizeT) lr->num_blocks,
(SizeT) lr->old_num_blocks,
MC_(detect_memory_leaks_last_delta_mode));
Modified: branches/BUF_REMOVAL/memcheck/mc_leakcheck.c
==============================================================================
--- branches/BUF_REMOVAL/memcheck/mc_leakcheck.c (original)
+++ branches/BUF_REMOVAL/memcheck/mc_leakcheck.c Sat Aug 2 20:37:07 2014
@@ -1427,12 +1427,14 @@
}
if (VG_(clo_verbosity) > 0 && !VG_(clo_xml)) {
- HChar d_bytes[20];
- HChar d_blocks[20];
+ HChar d_bytes[31];
+ HChar d_blocks[31];
# define DBY(new,old) \
- MC_(snprintf_delta) (d_bytes, 20, (new), (old), lcp->deltamode)
+ MC_(snprintf_delta) (d_bytes, sizeof(d_bytes), (new), (old), \
+ lcp->deltamode)
# define DBL(new,old) \
- MC_(snprintf_delta) (d_blocks, 20, (new), (old), lcp->deltamode)
+ MC_(snprintf_delta) (d_blocks, sizeof(d_blocks), (new), (old), \
+ lcp->deltamode)
VG_(umsg)("LEAK SUMMARY:\n");
VG_(umsg)(" definitely lost: %'lu%s bytes in %'lu%s blocks\n",
|