Don't include cleaned variables in inherited environment
cover Don't include cleaned variables in inherited environment
Per James Limbouris' report the pristine, saved environment is erroneously added to the data store. This patch fixes this bug by passing a list of the permitted variables to the inheritFromOS method and only inheriting those which appear in the approved list.
Please review the following changes for suitability for inclusion. If you have any objections or suggestions for improvement, please respond to the patches. If you agree with the changes, please provide your Acked-by.
The following changes since commit b3ad7acebfad3063c3364f4492f53b25bf53cf81:
lib/bb/ui/crumbs/hobprefs: fix erroneous save/reparse (2011-08-12 17:48:13 +0100)
are available in the git repository at:
git://github.com/incandescant/bitbake env
https://github.com/incandescant/bitbake/tree/env
Joshua Lock (1):
Ensure only the filtered environment variables are inherited from the
OS
bin/bitbake-layers | 6 +++--- lib/bb/cooker.py | 3 ++- lib/bb/data.py | 15 ++++++++------- lib/bb/utils.py | 23 ++++++++++++++++------- 4 files changed, 29 insertions(+), 18 deletions(-)
Signature · 1 line
1.7.6
RFC PATCH 1/1 Ensure only the filtered environment variables are inherited from the OS
The recent change which modified inheritFromOS to use the intial environment, rather than the current environment, introduced a bug such that variables which had been cleaned from the environment where still set in the data store.
This patch changes things such that a list of approved environment variables is saved after the environment is cleaned and only the variables in this list are inherited in inheritFromOS.
--- bin/bitbake-layers | 6 +++--- lib/bb/cooker.py | 3 ++- lib/bb/data.py | 15 ++++++++------- lib/bb/utils.py | 23 ++++++++++++++++------- 4 files changed, 29 insertions(+), 18 deletions(-)
bin/bitbake-layers +3 -3
@@ -28,9 +28,10 @@ default_cmd = 'show_appends' def main(args): logging.basicConfig(format='%(levelname)s: %(message)s') + initialenv = os.environ.copy() bb.utils.clean_environment() - cmds = Commands() + cmds = Commands(initialenv) if args: cmds.onecmd(' '.join(args)) else:
@@ -39,9 +40,8 @@ def main(args): class Commands(cmd.Cmd): - def __init__(self): + def __init__(self, initialenv): cmd.Cmd.__init__(self) - initialenv = os.environ.copy() self.returncode = 0 self.config = Config(parse_only=True) self.cooker = bb.cooker.BBCooker(self.config,
lib/bb/cooker.py +2 -1
@@ -163,7 +163,8 @@ class BBCooker: def loadConfigurationData(self): self.configuration.data = bb.data.init() - bb.data.inheritFromOS(self.configuration.data, self.savedenv) + filtered_keys = bb.utils.approved_variables() + bb.data.inheritFromOS(self.configuration.data, self.savedenv, filtered_keys) try: self.parseConfigurationFiles(self.configuration.prefile,
lib/bb/data.py +8 -7
@@ -159,16 +159,17 @@ def expandKeys(alterdata, readdata = None): ekey = todolist[key] renameVar(key, ekey, alterdata) -def inheritFromOS(d, savedenv): +def inheritFromOS(d, savedenv, permitted): """Inherit variables from the initial environment.""" exportlist = bb.utils.preserved_envvars_exported() for s in savedenv.keys(): - try: - setVar(s, getVar(s, savedenv, True), d) - if s in exportlist: - setVarFlag(s, "export", True, d) - except TypeError: - pass + if s in permitted: + try: + setVar(s, getVar(s, savedenv, True), d) + if s in exportlist: + setVarFlag(s, "export", True, d) + except TypeError: + pass def emit_var(var, o=sys.__stdout__, d = init(), all=False): """Emit a variable to be sourced by a shell."""
lib/bb/utils.py +16 -7
@@ -565,18 +565,27 @@ def create_interactive_env(d): for k in preserved_envvars_exported_interactive(): os.setenv(k, bb.data.getVar(k, d, True)) +def approved_variables(): + """ + Determine and return the list of whitelisted variables which are approved + to remain in the envrionment. + """ + approved = [] + if 'BB_ENV_WHITELIST' in os.environ: + approved = os.environ['BB_ENV_WHITELIST'].split() + else: + approved = preserved_envvars() + if 'BB_ENV_EXTRAWHITE' in os.environ: + approved.extend(os.environ['BB_ENV_EXTRAWHITE'].split()) + return approved + def clean_environment(): """ Clean up any spurious environment variables. This will remove any - variables the user hasn't chose to preserve. + variables the user hasn't chosen to preserve. """ if 'BB_PRESERVE_ENV' not in os.environ: - if 'BB_ENV_WHITELIST' in os.environ: - good_vars = os.environ['BB_ENV_WHITELIST'].split() - else: - good_vars = preserved_envvars() - if 'BB_ENV_EXTRAWHITE' in os.environ: - good_vars.extend(os.environ['BB_ENV_EXTRAWHITE'].split()) + good_vars = approved_variables() filter_environment(good_vars) def empty_environment():
Signature · 1 line
1.7.6
Richard Purdie
AppliedRe: [RFC PATCH 1/1] Ensure only the filtered environment variables are inherited from the OS
Quoted 12 lines · Joshua Lock
The recent change which modified inheritFromOS to use the intial environment, rather than the current environment, introduced a bug such that variables which had been cleaned from the environment where still set in the data store.
This patch changes things such that a list of approved environment variables is saved after the environment is cleaned and only the variables in this list are inherited in inheritFromOS.
CC James Limbouris <[email protected]>CC Chris Larson <[email protected]>Signed-off-by Joshua Lock <[email protected]>
Quoted 6 lines
--- bin/bitbake-layers | 6 +++--- lib/bb/cooker.py | 3 ++- lib/bb/data.py | 15 ++++++++------- lib/bb/utils.py | 23 ++++++++++++++++------- 4 files changed, 29 insertions(+), 18 deletions(-)
Merged to master, thanks.
Richard