Permalink
Browse files

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: #16727
Refs: #16669
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information...
addaleax authored and jasnell committed Nov 3, 2017
1 parent 5d0436f commit a5f3b3a6dab18e32ee5e7d0d79a63cec0d5d5cc5
Showing with 7 additions and 2 deletions.
  1. +2 −2 src/node_http2_core-inl.h
  2. +4 −0 src/stream_base-inl.h
  3. +1 −0 src/stream_base.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();
}
View
@@ -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
View
@@ -77,6 +77,7 @@ class WriteWrap: public ReqWrap<uv_write_t>,
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_; }

0 comments on commit a5f3b3a

Please sign in to comment.