From: Sage Weil Date: Fri, 16 Jun 2017 02:18:08 +0000 (-0400) Subject: messages/MOSDPing: initialize MOSDPing padding X-Git-Tag: v12.1.0~110^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9beaf5efd74daa8c15e50b42583264d1252a85f5;p=ceph.git messages/MOSDPing: initialize MOSDPing padding This memory must be initialized or else valgrind will be very unhappy. Avoid the cost of zeroing (or even allocating) the buffer for normal padding values by (re)using a static zero buffer. Fixes: http://tracker.ceph.com/issues/20323 Signed-off-by: Sage Weil --- diff --git a/src/messages/MOSDPing.h b/src/messages/MOSDPing.h index 7a8bf2f986f0..22d24d6aae7a 100644 --- a/src/messages/MOSDPing.h +++ b/src/messages/MOSDPing.h @@ -99,10 +99,22 @@ public: ::encode(op, payload); ::encode(peer_stat, payload); ::encode(stamp, payload); - bufferptr size_bp(MAX(min_message_size - payload.length(), 0)); - bufferlist size_bl;; - size_bl.push_back(size_bp); - ::encode(size_bl, payload); + + bufferlist pad; + size_t s = MAX(min_message_size - payload.length(), 0); + // this should be big enough for normal min_message padding sizes. since + // we are targetting jumbo ethernet frames around 9000 bytes, 16k should + // be more than sufficient! the compiler will statically zero this so + // that at runtime we are only adding a bufferptr reference to it. + static char zeros[16384] = {}; + while (s > sizeof(zeros)) { + pad.append(buffer::create_static(sizeof(zeros), zeros)); + s -= sizeof(zeros); + } + if (s) { + pad.append(buffer::create_static(s, zeros)); + } + ::encode(pad, payload); } const char *get_type_name() const override { return "osd_ping"; }