Commit 3a6ab5c7 authored by Thierry Reding's avatar Thierry Reding Committed by Linus Torvalds

scripts/spdxcheck.py: always open files in binary mode

The spdxcheck script currently falls over when confronted with a binary
file (such as Documentation/logo.gif).  To avoid that, always open files
in binary mode and decode line-by-line, ignoring encoding errors.

One tricky case is when piping data into the script and reading it from
standard input.  By default, standard input will be opened in text mode,
so we need to reopen it in binary mode.

The breakage only happens with python3 and results in a
UnicodeDecodeError (according to Uwe).

Link: http://lkml.kernel.org/r/20181212131210.28024-1-thierry.reding@gmail.com
Fixes: 6f4d29df ("scripts/spdxcheck.py: make python3 compliant")
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
Reviewed-by: default avatarJeremy Cline <jcline@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Joe Perches <joe@perches.com>
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f1733a1d
...@@ -168,6 +168,7 @@ class id_parser(object): ...@@ -168,6 +168,7 @@ class id_parser(object):
self.curline = 0 self.curline = 0
try: try:
for line in fd: for line in fd:
line = line.decode(locale.getpreferredencoding(False), errors='ignore')
self.curline += 1 self.curline += 1
if self.curline > maxlines: if self.curline > maxlines:
break break
...@@ -249,12 +250,13 @@ if __name__ == '__main__': ...@@ -249,12 +250,13 @@ if __name__ == '__main__':
try: try:
if len(args.path) and args.path[0] == '-': if len(args.path) and args.path[0] == '-':
parser.parse_lines(sys.stdin, args.maxlines, '-') stdin = os.fdopen(sys.stdin.fileno(), 'rb')
parser.parse_lines(stdin, args.maxlines, '-')
else: else:
if args.path: if args.path:
for p in args.path: for p in args.path:
if os.path.isfile(p): if os.path.isfile(p):
parser.parse_lines(open(p), args.maxlines, p) parser.parse_lines(open(p, 'rb'), args.maxlines, p)
elif os.path.isdir(p): elif os.path.isdir(p):
scan_git_subtree(repo.head.reference.commit.tree, p) scan_git_subtree(repo.head.reference.commit.tree, p)
else: else:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment