From 616981ecf9a5be5de467f9d9753ca47aa44c9d21 Mon Sep 17 00:00:00 2001 From: Philip Jenvey Date: Wed, 28 Aug 2019 20:35:05 -0700 Subject: [PATCH 1/2] clear extensions before reclaiming HttpRequests in their pool (#1063) Issue #1062 --- src/request.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/request.rs b/src/request.rs index 0fc0647ff..ac9b9933e 100644 --- a/src/request.rs +++ b/src/request.rs @@ -259,6 +259,7 @@ impl Drop for HttpRequest { if Rc::strong_count(&self.0) == 1 { let v = &mut self.0.pool.0.borrow_mut(); if v.len() < 128 { + self.extensions_mut().clear(); v.push(self.0.clone()); } } @@ -494,4 +495,36 @@ mod tests { let resp = call_service(&mut srv, req); assert_eq!(resp.status(), StatusCode::BAD_REQUEST); } + + #[test] + fn test_extensions_dropped() { + struct Tracker { + pub dropped: bool, + } + struct Foo { + tracker: Rc>, + } + impl Drop for Foo { + fn drop(&mut self) { + self.tracker.borrow_mut().dropped = true; + } + } + + let tracker = Rc::new(RefCell::new(Tracker { dropped: false })); + { + let tracker2 = Rc::clone(&tracker); + let mut srv = init_service(App::new().data(10u32).service( + web::resource("/").to(move |req: HttpRequest| { + req.extensions_mut().insert(Foo { tracker: Rc::clone(&tracker2) }); + HttpResponse::Ok() + }), + )); + + let req = TestRequest::default().to_request(); + let resp = call_service(&mut srv, req); + assert_eq!(resp.status(), StatusCode::OK); + } + + assert!(tracker.borrow().dropped); + } } From bae29897d695f70860ab0134fea1f88180560bae Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Thu, 29 Aug 2019 09:36:16 +0600 Subject: [PATCH 2/2] prep actix-web release --- CHANGES.md | 7 +++++++ Cargo.toml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 158c8dc9a..5f8f489fc 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,12 @@ # Changes +## [1.0.7] - 2019-08-29 + +### Fixed + +* Request Extensions leak #1062 + + ## [1.0.6] - 2019-08-28 ### Added diff --git a/Cargo.toml b/Cargo.toml index 5a73bf263..c2d3b0d2b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-web" -version = "1.0.6" +version = "1.0.7" authors = ["Nikolay Kim "] description = "Actix web is a simple, pragmatic and extremely fast web framework for Rust." readme = "README.md"