From eafc69b131391423cf2c37587af9444435db3dbb Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Fri, 23 Jun 2023 23:02:49 +0100 Subject: [PATCH] nim: extra module mangling to prevent runtime dependence Fix #207795 --- pkgs/development/compilers/nim/default.nix | 3 ++ .../compilers/nim/extra-mangling.patch | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 pkgs/development/compilers/nim/extra-mangling.patch diff --git a/pkgs/development/compilers/nim/default.nix b/pkgs/development/compilers/nim/default.nix index 1cbdd84ba63..43274b3d9d1 100644 --- a/pkgs/development/compilers/nim/default.nix +++ b/pkgs/development/compilers/nim/default.nix @@ -103,6 +103,9 @@ in { ./nixbuild.patch # Load libraries at runtime by absolute path + + ./extra-mangling.patch + # Mangle store paths of modules to prevent runtime dependence. ] ++ lib.optional (!stdenv.hostPlatform.isWindows) ./toLocation.patch; configurePhase = '' diff --git a/pkgs/development/compilers/nim/extra-mangling.patch b/pkgs/development/compilers/nim/extra-mangling.patch new file mode 100644 index 00000000000..b68f7033994 --- /dev/null +++ b/pkgs/development/compilers/nim/extra-mangling.patch @@ -0,0 +1,48 @@ +diff --git a/compiler/modulepaths.nim b/compiler/modulepaths.nim +index e80ea3fa6..8ecf27a85 100644 +--- a/compiler/modulepaths.nim ++++ b/compiler/modulepaths.nim +@@ -70,6 +70,13 @@ proc checkModuleName*(conf: ConfigRef; n: PNode; doLocalError=true): FileIndex = + else: + result = fileInfoIdx(conf, fullPath) + ++proc rot13(result: var string) = ++ for i, c in result: ++ case c ++ of 'a'..'m', 'A'..'M': result[i] = char(c.uint8 + 13) ++ of 'n'..'z', 'N'..'Z': result[i] = char(c.uint8 - 13) ++ else: discard ++ + proc mangleModuleName*(conf: ConfigRef; path: AbsoluteFile): string = + ## Mangle a relative module path to avoid path and symbol collisions. + ## +@@ -78,9 +85,11 @@ proc mangleModuleName*(conf: ConfigRef; path: AbsoluteFile): string = + ## + ## Example: + ## `foo-#head/../bar` becomes `@foo-@hhead@s..@sbar` +- "@m" & relativeTo(path, conf.projectPath).string.multiReplace( ++ result = "@m" & relativeTo(path, conf.projectPath).string.multiReplace( + {$os.DirSep: "@s", $os.AltSep: "@s", "#": "@h", "@": "@@", ":": "@c"}) ++ rot13(result) + + proc demangleModuleName*(path: string): string = + ## Demangle a relative module path. + result = path.multiReplace({"@@": "@", "@h": "#", "@s": "/", "@m": "", "@c": ":"}) ++ rot13(result) +diff --git a/compiler/msgs.nim b/compiler/msgs.nim +index 3f386cc61..054f7f647 100644 +--- a/compiler/msgs.nim ++++ b/compiler/msgs.nim +@@ -659,8 +659,10 @@ proc uniqueModuleName*(conf: ConfigRef; fid: FileIndex): string = + for i in 0..