Skip to contentSkip to conversation

Don't include cleaned variables in inherited environment

RFC PATCH Applied Joshua Lock 2 participants 3 messages Aug 13, 2011 – Aug 15, 2011

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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.

CC James Limbouris <[email protected]>
CC Chris Larson <[email protected]>
---
 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
index d9f95d1..3fdf567 100755
@@ -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
index 1978750..a0fcc15 100644
@@ -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
index 65144bf..ac0d880 100644
@@ -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
index 4eac285..a9c56e9 100644
@@ -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
#2 lore raw

Re: [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]>
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