Nim icon indicating copy to clipboard operation
Nim copied to clipboard

cross-package endless recursion

Open itaymigdal opened this issue 1 year ago • 5 comments

What happened?

hey, I have a super weird bug, I wrote two functions: encrypt_cbc and decrypt_cbc (both uses the nimcrypto package) - they both get the following parameters (string, key, iv) and do their job great.

Whenever I'm importing winim/clr to the program (Winim) - context.init(key, iv) calls for some reason to Winim CLR which invokes an endless recursion there, which crashes the program..

The functions:

proc encrypt_cbc(plain_text: string, key: string, iv: string): string =
    var ectx: CBC[aes256]
    var cipher_text = newString(aes256.sizeBlock * 2)
    var plain_text_padded = plain_text
    while len(plain_text_padded) mod 32 != 0:
        plain_text_padded = plain_text_padded & " "
    ectx.init(key, iv)                                                   # <- Problem starts from here
    ectx.encrypt(plain_text_padded, cipher_text)
    ectx.clear()
    return cipher_text

proc decrypt_cbc(cipher_text: string, key: string, iv: string): string =
    var dctx: CBC[aes256]
    var plain_text = newString(aes256.sizeBlock * 2)
    dctx.init(key, iv)                                                 # <- Problem starts from here
    dctx.decrypt(cipher_text, plain_text)
    dctx.clear()
    while plain_text.endsWith(" "):
        plain_text.removeSuffix(" ")
    return plain_text

image

thanks in advance, Itay

Nim Version

Nim Compiler Version 1.4.8 [Windows: amd64]

Current Standard Output Logs

Hint: c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.exe  [Exec]
Traceback (most recent call last)
c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.nim(74) agent_test
c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.nim(70) main
c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.nim(38) decrypt_cbc
C:\Users\Owner\.nimble\pkgs\nimcrypto-0.5.4\nimcrypto\bcmode.nim(275) init
C:\Users\Owner\.nimble\pkgs\nimcrypto-0.5.4\nimcrypto\bcmode.nim(261) init
C:\Users\Owner\.nimble\pkgs\nimcrypto-0.5.4\nimcrypto\rijndael.nim(1092) init
C:\Users\Owner\.nimble\pkgs\nimcrypto-0.5.4\nimcrypto\utils.nim(343) keySchedule
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
(1874 calls omitted) ...
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim toObject
Error: call depth limit reached in a debug build (2000 function calls). You can change it with -d:nimCallDepthLimit=<int> but really try to avoid deep recursions instead.
Error: execution of an external program failed: 'c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.exe '

Possible Solution

maybe if I could tell nimcrypto explicitly somewhere not to use winim/clr

itaymigdal avatar Aug 07 '22 14:08 itaymigdal

Is there a specific reason you assume this to be an issue with the nim language rather than nimcrypto?

PhilippMDoerner avatar Aug 07 '22 15:08 PhilippMDoerner

Actually I'm not sure where is the bug as I'm still new to Nim. If you think it is not related I'll close this one..

itaymigdal avatar Aug 07 '22 16:08 itaymigdal

Actually I'm not sure where is the bug as I'm still new to Nim. If you think it is not related I'll close this one..

I do not have that authority as I'm just another user that stumbled over your bug, however your output logs indicate to me that some code in nimcrypto is raising the error. The question is whether nimcrypto contains incorrect code, or whether it's code is completely correct but the compiler has a bug at that point somehwere. Which of these it is should first be evaluated by the maintainers of nimcrypto I would think.

If my own package tinypool were the cause of somebody to have an error I would also expect them to file an issue with my package, not with the nim language at large.

PhilippMDoerner avatar Aug 07 '22 17:08 PhilippMDoerner

Yes, I understand. Anyway I managed to solve it by splitting it to different files/modules and export only specific functions - ugly workaround

itaymigdal avatar Aug 07 '22 17:08 itaymigdal

Nice to hear you figured out a way around it for now!

PhilippMDoerner avatar Aug 07 '22 17:08 PhilippMDoerner