lib/modules: Only interpret class declaration in non-shorthand mode

This is to avoid stealing keys from submodules. `class` might be
common enough that reinterpreting existing `class` attributes in
configurations as a declaration leads to fairly widespread problems.
This commit is contained in:
Robert Hensing 2023-04-10 17:26:25 +02:00
parent 1f4a58ef03
commit 84b1b01702
4 changed files with 19 additions and 1 deletions

View file

@ -511,7 +511,7 @@ let
imports = m.require or [] ++ m.imports or []; imports = m.require or [] ++ m.imports or [];
options = {}; options = {};
config = addFreeformType (removeAttrs m ["_file" "key" "disabledModules" "require" "imports" "freeformType"]); config = addFreeformType (removeAttrs m ["_file" "key" "disabledModules" "require" "imports" "freeformType"]);
class = m.class or null; class = null;
}; };
applyModuleArgsIfFunction = key: f: args@{ config, options, lib, ... }: applyModuleArgsIfFunction = key: f: args@{ config, options, lib, ... }:

View file

@ -255,6 +255,8 @@ checkConfigError 'A definition for option .* is not of type .*' \
## Freeform modules ## Freeform modules
# Assigning without a declared option should work # Assigning without a declared option should work
checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix
# Shorthand modules interpret `meta` and `class` as config items
checkConfigOutput '^true$' options._module.args.value.result ./freeform-attrsOf.nix ./define-freeform-keywords-shorthand.nix
# No freeform assignments shouldn't make it error # No freeform assignments shouldn't make it error
checkConfigOutput '^{ }$' config ./freeform-attrsOf.nix checkConfigOutput '^{ }$' config ./freeform-attrsOf.nix
# but only if the type matches # but only if the type matches

View file

@ -25,6 +25,7 @@
./module-class-is-nixos.nix ./module-class-is-nixos.nix
{ _file = "foo.nix#darwinModules.default"; { _file = "foo.nix#darwinModules.default";
class = "darwin"; class = "darwin";
config = {};
imports = []; imports = [];
} }
]; ];

View file

@ -0,0 +1,15 @@
{ config, ... }: {
class = { "just" = "data"; };
a = "one";
b = "two";
meta = "meta";
_module.args.result =
let r = builtins.removeAttrs config [ "_module" ];
in builtins.trace (builtins.deepSeq r r) (r == {
a = "one";
b = "two";
class = { "just" = "data"; };
meta = "meta";
});
}