diff options
author | Christopher Larson <chris_larson@mentor.com> | 2015-07-31 11:16:46 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-08-01 22:24:20 +0100 |
commit | 22078d5e533e59a9aa6999abefbf6ece4e01de8d (patch) | |
tree | e0c99f600700dcc743c3d6b3c3ff5c7198910bab /bitbake/lib/bb/parse | |
parent | 75fc6bf0a02dd0512a958cf0c1461f4e98796736 (diff) | |
download | openembedded-core-contrib-22078d5e533e59a9aa6999abefbf6ece4e01de8d.tar.gz |
bitbake: bb.parse: properly error out on filesystem errors
We've had a long-standing bug where a legitimate error reading a file (IOError
or OSError) is always suppressed as though it was a 'file not found' case. As
a concrete example, if you do a `chmod 000 conf/local.conf`, it'll silently
not parse local.conf, rather than erroring to let the user know about the
problem.
Fix this by handling the ENOENT case specifically.
(Bitbake rev: e691312a3add222b04e7b2f52f8df6abcb9068bf)
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/parse')
-rw-r--r-- | bitbake/lib/bb/parse/__init__.py | 7 | ||||
-rw-r--r-- | bitbake/lib/bb/parse/parse_py/ConfHandler.py | 21 |
2 files changed, 18 insertions, 10 deletions
diff --git a/bitbake/lib/bb/parse/__init__.py b/bitbake/lib/bb/parse/__init__.py index 4a78e183ab..1becaa4f02 100644 --- a/bitbake/lib/bb/parse/__init__.py +++ b/bitbake/lib/bb/parse/__init__.py @@ -26,9 +26,10 @@ File parsers for the BitBake build tools. handlers = [] +import errno +import logging import os import stat -import logging import bb import bb.utils import bb.siggen @@ -122,12 +123,12 @@ def resolve_file(fn, d): for af in attempts: mark_dependency(d, af) if not newfn: - raise IOError("file %s not found in %s" % (fn, bbpath)) + raise IOError(errno.ENOENT, "file %s not found in %s" % (fn, bbpath)) fn = newfn mark_dependency(d, fn) if not os.path.isfile(fn): - raise IOError("file %s not found" % fn) + raise IOError(errno.ENOENT, "file %s not found" % fn) return fn diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/parse/parse_py/ConfHandler.py index 250a557cb4..fbd75b14ad 100644 --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py @@ -24,8 +24,9 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -import re, os -import logging +import errno +import re +import os import bb.utils from bb.parse import ParseError, resolve_file, ast, logger, handle @@ -92,11 +93,17 @@ def include(parentfn, fn, lineno, data, error_out): logger.warn("Duplicate inclusion for %s in %s" % (fn, data.getVar('FILE', True))) try: - ret = bb.parse.handle(fn, data, True) - except (IOError, OSError): - if error_out: - raise ParseError("Could not %(error_out)s file %(fn)s" % vars(), parentfn, lineno) - logger.debug(2, "CONF file '%s' not found", fn) + bb.parse.handle(fn, data, True) + except (IOError, OSError) as exc: + if exc.errno == errno.ENOENT: + if error_out: + raise ParseError("Could not %s file %s" % (error_out, fn), parentfn, lineno) + logger.debug(2, "CONF file '%s' not found", fn) + else: + if error_out: + raise ParseError("Could not %s file %s: %s" % (error_out, fn, exc.strerror), parentfn, lineno) + else: + raise ParseError("Error parsing %s: %s" % (fn, exc.strerror), parentfn, lineno) # We have an issue where a UI might want to enforce particular settings such as # an empty DISTRO variable. If configuration files do something like assigning |