diff --git a/quic/api/QuicTransportBase.cpp b/quic/api/QuicTransportBase.cpp index 75d92e74a..597c37f66 100644 --- a/quic/api/QuicTransportBase.cpp +++ b/quic/api/QuicTransportBase.cpp @@ -1964,6 +1964,7 @@ folly::Expected QuicTransportBase::resetStream( pendingResetIt++) { cancelDeliveryCallbacksForStream(pendingResetIt->first); } + pendingWriteCallbacks_.erase(id); QUIC_STATS(conn_->infoCallback, onQuicStreamReset); } catch (const QuicTransportException& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " diff --git a/quic/api/test/QuicTransportBaseTest.cpp b/quic/api/test/QuicTransportBaseTest.cpp index 315c50b5d..654006576 100644 --- a/quic/api/test/QuicTransportBaseTest.cpp +++ b/quic/api/test/QuicTransportBaseTest.cpp @@ -1451,6 +1451,17 @@ TEST_F(QuicTransportImplTest, TestImmediateClose) { evb->loopOnce(); } +TEST_F(QuicTransportImplTest, ResetStreamUnsetWriteCallback) { + auto stream = transport->createBidirectionalStream().value(); + NiceMock wcb; + EXPECT_CALL(wcb, onStreamWriteError(stream, _)).Times(0); + transport->notifyPendingWriteOnStream(stream, &wcb); + EXPECT_FALSE( + transport->resetStream(stream, GenericApplicationErrorCode::UNKNOWN) + .hasError()); + evb->loopOnce(); +} + TEST_F(QuicTransportImplTest, DestroyWithoutClosing) { EXPECT_CALL(connCallback, onConnectionError(_)).Times(0); EXPECT_CALL(connCallback, onConnectionEnd()).Times(0);