diff options
author | Yusuke Tanaka <yusuktan@maguro.dev> | 2022-10-18 11:28:27 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-18 11:28:27 +0900 |
commit | 44a89dd6dc7864822ddb48d030af519160de90a2 (patch) | |
tree | 3a7fe40040372d6118a86276d7d91317ab026de5 /core/resources.rs | |
parent | 74be01273c16b83b1063da1750045b12e095f0c3 (diff) |
fix(ext/net): return an error from `startTls` and `serveHttp` if the original connection is captured elsewhere (#16242)
This commit removes the calls to `expect()` on `std::rc::Rc`, which caused
Deno to panic under certain situations. We now return an error if `Rc`
is referenced by other variables.
Fixes #9360
Fixes #13345
Fixes #13926
Fixes #16241
Co-authored-by: Bartek IwaĆczuk <biwanczuk@gmail.com>
Diffstat (limited to 'core/resources.rs')
-rw-r--r-- | core/resources.rs | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/core/resources.rs b/core/resources.rs index ee9ee689f..164c377a2 100644 --- a/core/resources.rs +++ b/core/resources.rs @@ -291,6 +291,12 @@ impl ResourceTable { /// If a resource with the given `rid` exists but its type does not match `T`, /// it is not removed from the resource table. Note that the resource's /// `close()` method is *not* called. + /// + /// Also note that there might be a case where + /// the returned `Rc<T>` is referenced by other variables. That is, we cannot + /// assume that `Rc::strong_count(&returned_rc)` is always equal to 1 on success. + /// In particular, be really careful when you want to extract the inner value of + /// type `T` from `Rc<T>`. pub fn take<T: Resource>(&mut self, rid: ResourceId) -> Result<Rc<T>, Error> { let resource = self.get::<T>(rid)?; self.index.remove(&rid); @@ -299,6 +305,12 @@ impl ResourceTable { /// Removes a resource from the resource table and returns it. Note that the /// resource's `close()` method is *not* called. + /// + /// Also note that there might be a + /// case where the returned `Rc<T>` is referenced by other variables. That is, + /// we cannot assume that `Rc::strong_count(&returned_rc)` is always equal to 1 + /// on success. In particular, be really careful when you want to extract the + /// inner value of type `T` from `Rc<T>`. pub fn take_any( &mut self, rid: ResourceId, |