Skip to content

Commit 31b3ecf

Browse files
committed
[native_assets_builder] Don't pass in the whole environment
1 parent 62f0754 commit 31b3ecf

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

pkgs/native_assets_builder/lib/src/build_runner/build_runner.dart

+32-2
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ class NativeAssetsBuildRunner {
434434
null,
435435
hookKernelFile,
436436
packageLayout!,
437+
_filteredEnvironment(_environmentVariablesFilter),
437438
),
438439
);
439440
if (buildOutput == null) return null;
@@ -489,6 +490,7 @@ class NativeAssetsBuildRunner {
489490
final environmentFile = File.fromUri(
490491
config.outputDirectory.resolve('../environment.json'),
491492
);
493+
final environment = _filteredEnvironment(_environmentVariablesFilter);
492494
if (buildOutputFile.existsSync() &&
493495
dependenciesHashFile.existsSync() &&
494496
environmentFile.existsSync()) {
@@ -512,7 +514,7 @@ ${e.message}
512514
!const MapEquality<String, String>().equals(
513515
(json.decode(await environmentFile.readAsString()) as Map)
514516
.cast<String, String>(),
515-
Platform.environment);
517+
environment);
516518
if (outdatedFile == null && !environmentChanged) {
517519
logger.info(
518520
'Skipping ${hook.name} for ${config.packageName}'
@@ -547,14 +549,15 @@ ${e.message}
547549
resources,
548550
hookKernelFile,
549551
packageLayout,
552+
environment,
550553
);
551554
if (result == null) {
552555
if (await dependenciesHashFile.exists()) {
553556
await dependenciesHashFile.delete();
554557
}
555558
} else {
556559
await environmentFile.writeAsString(
557-
json.encode(Platform.environment),
560+
json.encode(environment),
558561
);
559562
final modifiedDuringBuild =
560563
await dependenciesHashes.hashFilesAndDirectories(
@@ -574,6 +577,22 @@ ${e.message}
574577
);
575578
}
576579

580+
/// Limit the environment that hook invocations get to see.
581+
///
582+
/// This allowlist lists environment variables needed to run mainstream
583+
/// compilers.
584+
static const _environmentVariablesFilter = {
585+
'ANDROID_HOME',
586+
'HOME',
587+
'PATH',
588+
'PROGRAMDATA',
589+
'SYSTEMROOT',
590+
'TEMP',
591+
'TMP',
592+
'TMPDIR',
593+
'USER_PROFILE',
594+
};
595+
577596
Future<HookOutput?> _runHookForPackage(
578597
Hook hook,
579598
HookConfig config,
@@ -583,6 +602,7 @@ ${e.message}
583602
Uri? resources,
584603
File hookKernelFile,
585604
PackageLayout packageLayout,
605+
Map<String, String> environment,
586606
) async {
587607
final configFile = config.outputDirectory.resolve('../config.json');
588608
final configFileContents =
@@ -607,6 +627,8 @@ ${e.message}
607627
executable: dartExecutable,
608628
arguments: arguments,
609629
logger: logger,
630+
includeParentEnvironment: false,
631+
environment: environment,
610632
);
611633

612634
var deleteOutputIfExists = false;
@@ -663,6 +685,12 @@ ${e.message}
663685
}
664686
}
665687

688+
Map<String, String> _filteredEnvironment(Set<String> allowList) => {
689+
for (final entry in Platform.environment.entries)
690+
if (allowList.contains(entry.key.toUpperCase()))
691+
entry.key: entry.value,
692+
};
693+
666694
/// Compiles the hook to kernel and caches the kernel.
667695
///
668696
/// If any of the Dart source files, or the package config changed after
@@ -783,6 +811,8 @@ ${e.message}
783811
executable: dartExecutable,
784812
arguments: compileArguments,
785813
logger: logger,
814+
includeParentEnvironment: false,
815+
environment: _filteredEnvironment({'HOME', 'PUB_CACHE', 'SYSTEMROOT'}),
786816
);
787817
var success = true;
788818
if (compileResult.exitCode != 0) {

0 commit comments

Comments
 (0)