aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoss Burton <ross.burton@intel.com>2016-07-25 23:32:26 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-07-26 08:10:04 +0100
commit508112793ee7ace613f07695222997309a2ca58f (patch)
tree31ea207b8f0be93bbce94e28194e96c1a9d27485
parentcecee440a76950f2824ea34b88e84185be493337 (diff)
downloadbitbake-508112793ee7ace613f07695222997309a2ca58f.tar.gz
lib/bb/build: handle incomplete message fragments in log FIFO
It's possible that the logging FIFO doesn't do a complete read (or the sender a complete write) with the result that an incomplete message is read in bitbake. This used to result in silently truncated lines but since 42d727 now also results in a warning as the start of the rest of the message isn't a valid logging command. Solve this by storing incoming bytes in a bytearray() across reads, and parsing complete messages from that. [ YOCTO #9999 ] Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/build.py67
1 files changed, 36 insertions, 31 deletions
diff --git a/lib/bb/build.py b/lib/bb/build.py
index a4deb00b8..c632a271f 100644
--- a/lib/bb/build.py
+++ b/lib/bb/build.py
@@ -385,39 +385,44 @@ exit $ret
else:
bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress))
+ fifobuffer = bytearray()
def readfifo(data):
- lines = data.split(b'\0')
- for line in lines:
- # Just skip empty commands
- if not line:
- continue
- splitval = line.split(b' ', 1)
- cmd = splitval[0].decode("utf-8")
- if len(splitval) > 1:
- value = splitval[1].decode("utf-8")
- else:
- value = ''
- if cmd == 'bbplain':
- bb.plain(value)
- elif cmd == 'bbnote':
- bb.note(value)
- elif cmd == 'bbwarn':
- bb.warn(value)
- elif cmd == 'bberror':
- bb.error(value)
- elif cmd == 'bbfatal':
- # The caller will call exit themselves, so bb.error() is
- # what we want here rather than bb.fatal()
- bb.error(value)
- elif cmd == 'bbfatal_log':
- bb.error(value, forcelog=True)
- elif cmd == 'bbdebug':
- splitval = value.split(' ', 1)
- level = int(splitval[0])
- value = splitval[1]
- bb.debug(level, value)
+ nonlocal fifobuffer
+ fifobuffer.extend(data)
+ while fifobuffer:
+ message, token, nextmsg = fifobuffer.partition(b"\00")
+ if token:
+ splitval = message.split(b' ', 1)
+ cmd = splitval[0].decode("utf-8")
+ if len(splitval) > 1:
+ value = splitval[1].decode("utf-8")
+ else:
+ value = ''
+ if cmd == 'bbplain':
+ bb.plain(value)
+ elif cmd == 'bbnote':
+ bb.note(value)
+ elif cmd == 'bbwarn':
+ bb.warn(value)
+ elif cmd == 'bberror':
+ bb.error(value)
+ elif cmd == 'bbfatal':
+ # The caller will call exit themselves, so bb.error() is
+ # what we want here rather than bb.fatal()
+ bb.error(value)
+ elif cmd == 'bbfatal_log':
+ bb.error(value, forcelog=True)
+ elif cmd == 'bbdebug':
+ splitval = value.split(' ', 1)
+ level = int(splitval[0])
+ value = splitval[1]
+ bb.debug(level, value)
+ else:
+ bb.warn("Unrecognised command '%s' on FIFO" % cmd)
+ fifobuffer = nextmsg
else:
- bb.warn("Unrecognised command '%s' on FIFO" % cmd)
+ break
+
tempdir = d.getVar('T', True)
fifopath = os.path.join(tempdir, 'fifo.%s' % os.getpid())
if os.path.exists(fifopath):