summaryrefslogtreecommitdiff
path: root/core/resources.rs
diff options
context:
space:
mode:
authorYusuke Tanaka <yusuktan@maguro.dev>2022-10-18 11:28:27 +0900
committerGitHub <noreply@github.com>2022-10-18 11:28:27 +0900
commit44a89dd6dc7864822ddb48d030af519160de90a2 (patch)
tree3a7fe40040372d6118a86276d7d91317ab026de5 /core/resources.rs
parent74be01273c16b83b1063da1750045b12e095f0c3 (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.rs12
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,