From a5f3b3a6dab18e32ee5e7d0d79a63cec0d5d5cc5 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Fri, 3 Nov 2017 20:13:18 +0100 Subject: [PATCH] src: add method to compute storage in WriteWrap `WriteWrap` instances may contain extra storage space. `self_size()` returns the size of the *entire* struct, member fields as well as storage space, so it is not an accurate measure for the storage space available. Add a method `ExtraSize()` (like the existing `Extra()` for accessing the storage memory) that yields the wanted value, and use it in the HTTP2 impl to fix a crash. PR-URL: https://github.com/nodejs/node/pull/16727 Refs: https://github.com/nodejs/node/pull/16669 Reviewed-By: Anatoli Papirovski Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- src/node_http2_core-inl.h | 4 ++-- src/stream_base-inl.h | 4 ++++ src/stream_base.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/node_http2_core-inl.h b/src/node_http2_core-inl.h index eda8a93ee79ff0..c78e5d673f41f4 100644 --- a/src/node_http2_core-inl.h +++ b/src/node_http2_core-inl.h @@ -503,7 +503,7 @@ inline void Nghttp2Session::SendPendingData() { while ((srcLength = nghttp2_session_mem_send(session_, &src)) > 0) { if (req == nullptr) { req = AllocateSend(); - destRemaining = req->self_size(); + destRemaining = req->ExtraSize(); dest = req->Extra(); } DEBUG_HTTP2("Nghttp2Session %s: nghttp2 has %d bytes to send\n", @@ -525,7 +525,7 @@ inline void Nghttp2Session::SendPendingData() { srcRemaining -= destRemaining; srcOffset += destRemaining; req = AllocateSend(); - destRemaining = req->self_size(); + destRemaining = req->ExtraSize(); dest = req->Extra(); } diff --git a/src/stream_base-inl.h b/src/stream_base-inl.h index 667c0a9ffbd50d..e1e50802f2a06a 100644 --- a/src/stream_base-inl.h +++ b/src/stream_base-inl.h @@ -160,6 +160,10 @@ char* WriteWrap::Extra(size_t offset) { offset; } +size_t WriteWrap::ExtraSize() const { + return storage_size_ - ROUND_UP(sizeof(*this), kAlignSize); +} + } // namespace node #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS diff --git a/src/stream_base.h b/src/stream_base.h index 9833a82636d28e..20cb0155c9d7b9 100644 --- a/src/stream_base.h +++ b/src/stream_base.h @@ -77,6 +77,7 @@ class WriteWrap: public ReqWrap, size_t extra = 0); inline void Dispose(); inline char* Extra(size_t offset = 0); + inline size_t ExtraSize() const; inline StreamBase* wrap() const { return wrap_; }