From 0e17365d54a4c104a9854f269758562eccc91450 Mon Sep 17 00:00:00 2001 From: ankit Date: Mon, 9 Mar 2026 23:50:22 +0530 Subject: [PATCH] fix: implement TODO to properly escape individual items in environment variables previously environment variables like IMPORT_PATHS, SOURCE_FILES, and LIBS were created by joining values directly. This could break when paths contained spaces. implement the existing TODO by escaping each item using escapeShellFileName before joining. --- source/dub/generators/generator.d | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 8d8739a8e4..49add7046e 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -1120,14 +1120,17 @@ const(string[string])[] makeCommandEnvironmentVariables(CommandType type, import std.process : environment, escapeShellFileName; string[string] env; - // TODO: do more elaborate things here - // TODO: escape/quote individual items appropriately - env["VERSIONS"] = join(build_settings.versions, " "); - env["LIBS"] = join(build_settings.libs, " "); - env["SOURCE_FILES"] = join(build_settings.sourceFiles, " "); - env["IMPORT_PATHS"] = join(build_settings.importPaths, " "); - env["C_IMPORT_PATHS"] = join(build_settings.cImportPaths, " "); - env["STRING_IMPORT_PATHS"] = join(build_settings.stringImportPaths, " "); + + auto escapeJoin(const(string)[] args) { + return args.map!(escapeShellFileName).join(" "); + } + + env["VERSIONS"] = escapeJoin(build_settings.versions); + env["LIBS"] = escapeJoin(build_settings.libs); + env["SOURCE_FILES"] = escapeJoin(build_settings.sourceFiles); + env["IMPORT_PATHS"] = escapeJoin(build_settings.importPaths); + env["C_IMPORT_PATHS"] = escapeJoin(build_settings.cImportPaths); + env["STRING_IMPORT_PATHS"] = escapeJoin(build_settings.stringImportPaths); env["DC"] = settings.platform.compilerBinary; env["DC_BASE"] = settings.platform.compiler;