Fix config env vars that are prefix of another with underscore. #7748
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This fixes the CARGO_BUILD_TARGET_DIR and CARGO_PROFILE_DEV_DEBUG_ASSERTIONS environment variables. Hopefully the big comment explains everything, but to review:
deserialize_option
does not know the type of the value it is about to deserialize. The type could be a struct, in which case it needs to check ifCARGO_FOO_BAR_*
environment variables are set. However, when deserializing something likebuild.target
, this prefix check will incorrectly matchCARGO_BUILD_TARGET_DIR
which happens to be a prefix ofCARGO_BUILD_TARGET_*
. It attempts to callvisit_some
which fails ifCARGO_BUILD_TARGET
is not set.The solution here is to detect scenarios where one field is a prefix of another, and skip the environment prefix check (by setting
Deserializer::env_prefix_ok
appropriately). This means we cannot haveOption<SomeStruct>
be a prefix of another field with an underscore. I think that's fine, and we should try to probably avoid these kinds a prefixes anyways.Closes #7253.