summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-10-17 16:47:29 -0700
committerSage Weil <sage@inktank.com>2013-10-17 16:47:29 -0700
commit3cfe9f602b153f51fae4017c402e11ac37870e2c (patch)
tree9a4209eca40472ef7ad8d3c6201e1a6d06f0ead3
parent8ec3aed516980e30aaacd071d8560a9afc9163f8 (diff)
downloadceph-3cfe9f602b153f51fae4017c402e11ac37870e2c.tar.gz
common/buffer: invalidate crc on zero, copy_in
This does not capture users who - calc a crc - use c_str() to modify the buffer content - (re)calc a crc Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/common/buffer.cc7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/common/buffer.cc b/src/common/buffer.cc
index 221a9977109..49307055715 100644
--- a/src/common/buffer.cc
+++ b/src/common/buffer.cc
@@ -121,6 +121,10 @@ static uint32_t simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZE
Spinlock::Locker l(crc_lock);
crc_map[fromto] = crc;
}
+ void invalidate_crc() {
+ Spinlock::Locker l(crc_lock);
+ crc_map.clear();
+ }
};
class buffer::raw_malloc : public buffer::raw {
@@ -451,17 +455,20 @@ static uint32_t simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZE
assert(_raw);
assert(o <= _len);
assert(o+l <= _len);
+ _raw->invalidate_crc();
memcpy(c_str()+o, src, l);
}
void buffer::ptr::zero()
{
+ _raw->invalidate_crc();
memset(c_str(), 0, _len);
}
void buffer::ptr::zero(unsigned o, unsigned l)
{
assert(o+l <= _len);
+ _raw->invalidate_crc();
memset(c_str()+o, 0, l);
}