@@ -199,11 +199,12 @@ int Packet::Send(uv_udp_t* handle, BaseObjectPtr<BaseObject> ref) {
199199}
200200
201201void Packet::Done (int status) {
202- DCHECK_NOT_NULL (listener_);
203- listener_->PacketDone (status);
202+ if (listener_ != nullptr ) {
203+ listener_->PacketDone (status);
204+ }
205+ listener_ = nullptr ;
204206 handle_.reset ();
205207 data_.reset ();
206- listener_ = nullptr ;
207208 Reset ();
208209
209210 // As a performance optimization, we add this packet to a freelist
@@ -261,7 +262,10 @@ BaseObjectPtr<Packet> Packet::CreateRetryPacket(
261262 path_descriptor.dcid ,
262263 vec.base ,
263264 vec.len );
264- if (nwrite <= 0 ) return BaseObjectPtr<Packet>();
265+ if (nwrite <= 0 ) {
266+ packet->Done (UV_ECANCELED);
267+ return BaseObjectPtr<Packet>();
268+ }
265269 packet->Truncate (static_cast <size_t >(nwrite));
266270 return packet;
267271}
@@ -272,13 +276,16 @@ BaseObjectPtr<Packet> Packet::CreateConnectionClosePacket(
272276 const SocketAddress& destination,
273277 ngtcp2_conn* conn,
274278 const QuicError& error) {
275- auto packet = Packet:: Create (
279+ auto packet = Create (
276280 env, listener, destination, kDefaultMaxPacketLength , " connection close" );
277281 ngtcp2_vec vec = *packet;
278282
279283 ssize_t nwrite = ngtcp2_conn_write_connection_close (
280284 conn, nullptr , nullptr , vec.base , vec.len , error, uv_hrtime ());
281- if (nwrite < 0 ) return BaseObjectPtr<Packet>();
285+ if (nwrite < 0 ) {
286+ packet->Done (UV_ECANCELED);
287+ return BaseObjectPtr<Packet>();
288+ }
282289 packet->Truncate (static_cast <size_t >(nwrite));
283290 return packet;
284291}
@@ -288,11 +295,11 @@ BaseObjectPtr<Packet> Packet::CreateImmediateConnectionClosePacket(
288295 Listener* listener,
289296 const PathDescriptor& path_descriptor,
290297 const QuicError& reason) {
291- auto packet = Packet:: Create (env,
292- listener,
293- path_descriptor.remote_address ,
294- kDefaultMaxPacketLength ,
295- " immediate connection close (endpoint)" );
298+ auto packet = Create (env,
299+ listener,
300+ path_descriptor.remote_address ,
301+ kDefaultMaxPacketLength ,
302+ " immediate connection close (endpoint)" );
296303 ngtcp2_vec vec = *packet;
297304 ssize_t nwrite = ngtcp2_crypto_write_connection_close (
298305 vec.base ,
@@ -305,7 +312,10 @@ BaseObjectPtr<Packet> Packet::CreateImmediateConnectionClosePacket(
305312 // there is one in the QuicError
306313 nullptr ,
307314 0 );
308- if (nwrite <= 0 ) return BaseObjectPtr<Packet>();
315+ if (nwrite <= 0 ) {
316+ packet->Done (UV_ECANCELED);
317+ return BaseObjectPtr<Packet>();
318+ }
309319 packet->Truncate (static_cast <size_t >(nwrite));
310320 return packet;
311321}
@@ -329,16 +339,17 @@ BaseObjectPtr<Packet> Packet::CreateStatelessResetPacket(
329339 uint8_t random[kRandlen ];
330340 CHECK (crypto::CSPRNG (random, kRandlen ).is_ok ());
331341
332- auto packet = Packet:: Create (env,
333- listener,
334- path_descriptor.remote_address ,
335- kDefaultMaxPacketLength ,
336- " stateless reset" );
342+ auto packet = Create (env,
343+ listener,
344+ path_descriptor.remote_address ,
345+ kDefaultMaxPacketLength ,
346+ " stateless reset" );
337347 ngtcp2_vec vec = *packet;
338348
339349 ssize_t nwrite = ngtcp2_pkt_write_stateless_reset (
340350 vec.base , pktlen, token, random, kRandlen );
341351 if (nwrite <= static_cast <ssize_t >(kMinStatelessResetLen )) {
352+ packet->Done (UV_ECANCELED);
342353 return BaseObjectPtr<Packet>();
343354 }
344355
@@ -377,11 +388,11 @@ BaseObjectPtr<Packet> Packet::CreateVersionNegotiationPacket(
377388 size_t pktlen = path_descriptor.dcid .length () +
378389 path_descriptor.scid .length () + (sizeof (sv)) + 7 ;
379390
380- auto packet = Packet:: Create (env,
381- listener,
382- path_descriptor.remote_address ,
383- kDefaultMaxPacketLength ,
384- " version negotiation" );
391+ auto packet = Create (env,
392+ listener,
393+ path_descriptor.remote_address ,
394+ kDefaultMaxPacketLength ,
395+ " version negotiation" );
385396 ngtcp2_vec vec = *packet;
386397
387398 ssize_t nwrite =
@@ -394,7 +405,10 @@ BaseObjectPtr<Packet> Packet::CreateVersionNegotiationPacket(
394405 path_descriptor.scid .length (),
395406 sv,
396407 arraysize (sv));
397- if (nwrite <= 0 ) return BaseObjectPtr<Packet>();
408+ if (nwrite <= 0 ) {
409+ packet->Done (UV_ECANCELED);
410+ return BaseObjectPtr<Packet>();
411+ }
398412 packet->Truncate (static_cast <size_t >(nwrite));
399413 return packet;
400414}
0 commit comments