summary refs log tree commit diff stats
diff options
context:
space:
mode:
authoralaviss <leorize+oss@disroot.org>2021-06-14 11:26:12 -0500
committerGitHub <noreply@github.com>2021-06-14 18:26:12 +0200
commit0adb47aa15e242983c8251d85367c0fe45fc5f12 (patch)
tree335397579a790b5b689199a9b2d14a3d5015781e
parent2d34b1f5bc45a180d1b53d6c24857133859a4f46 (diff)
downloadNim-0adb47aa15e242983c8251d85367c0fe45fc5f12.tar.gz
system/excpt: check if the exception is not nil before pop (#18247)
In CPS we would consume an exception in the except branch by stashing it
into a local then remove the exception from Nim environment so as not to
leak it to other code that would be running before the continuation
continues

However since popCurrentException() assumes that the exception always
exist, removing the exception from an except branch will cause a
SIGSEGV to happen. This commit fixes that.
-rw-r--r--lib/system/excpt.nim5
-rw-r--r--tests/exception/tsetexceptions.nim7
2 files changed, 10 insertions, 2 deletions
diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim
index 5b7d4d49f..72225cf96 100644
--- a/lib/system/excpt.nim
+++ b/lib/system/excpt.nim
@@ -135,8 +135,9 @@ proc pushCurrentException(e: sink(ref Exception)) {.compilerRtl, inl.} =
   #showErrorMessage2 "A"
 
 proc popCurrentException {.compilerRtl, inl.} =
-  currException = currException.up
-  #showErrorMessage2 "B"
+  if currException != nil:
+    currException = currException.up
+    #showErrorMessage2 "B"
 
 proc popCurrentExceptionEx(id: uint) {.compilerRtl.} =
   discard "only for bootstrapping compatbility"
diff --git a/tests/exception/tsetexceptions.nim b/tests/exception/tsetexceptions.nim
index 557fc1898..386a6ae4c 100644
--- a/tests/exception/tsetexceptions.nim
+++ b/tests/exception/tsetexceptions.nim
@@ -6,3 +6,10 @@ let ex = newException(CatchableError, "test")
 setCurrentException(ex)
 doAssert getCurrentException().msg == ex.msg
 doAssert getCurrentExceptionMsg() == ex.msg
+setCurrentException(nil)
+
+try:
+  raise newException(CatchableError, "test2")
+except:
+  setCurrentException(nil)
+doAssert getCurrentException() == nil