diff options
author | Ross Burton <ross.burton@intel.com> | 2016-07-25 23:32:26 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-07-26 08:10:37 +0100 |
commit | 1393b23f512b42d0dc547677f3fc3a88f3864a31 (patch) | |
tree | 42c71f8c9cf70d11dcdfd5e1ab5d775fa7d963fe /bitbake/lib/bb | |
parent | 9411e33b8863d5b88042a03b8e1950c5fcbae36b (diff) | |
download | poky-1393b23f512b42d0dc547677f3fc3a88f3864a31.tar.gz |
bitbake: 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 ]
(Bitbake rev: 508112793ee7ace613f07695222997309a2ca58f)
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb')
-rw-r--r-- | bitbake/lib/bb/build.py | 67 |
1 files changed, 36 insertions, 31 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py index a4deb00b88..c632a271fe 100644 --- a/bitbake/lib/bb/build.py +++ b/bitbake/lib/bb/build.py | |||
@@ -385,39 +385,44 @@ exit $ret | |||
385 | else: | 385 | else: |
386 | bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress)) | 386 | bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress)) |
387 | 387 | ||
388 | fifobuffer = bytearray() | ||
388 | def readfifo(data): | 389 | def readfifo(data): |
389 | lines = data.split(b'\0') | 390 | nonlocal fifobuffer |
390 | for line in lines: | 391 | fifobuffer.extend(data) |
391 | # Just skip empty commands | 392 | while fifobuffer: |
392 | if not line: | 393 | message, token, nextmsg = fifobuffer.partition(b"\00") |
393 | continue | 394 | if token: |
394 | splitval = line.split(b' ', 1) | 395 | splitval = message.split(b' ', 1) |
395 | cmd = splitval[0].decode("utf-8") | 396 | cmd = splitval[0].decode("utf-8") |
396 | if len(splitval) > 1: | 397 | if len(splitval) > 1: |
397 | value = splitval[1].decode("utf-8") | 398 | value = splitval[1].decode("utf-8") |
398 | else: | 399 | else: |
399 | value = '' | 400 | value = '' |
400 | if cmd == 'bbplain': | 401 | if cmd == 'bbplain': |
401 | bb.plain(value) | 402 | bb.plain(value) |
402 | elif cmd == 'bbnote': | 403 | elif cmd == 'bbnote': |
403 | bb.note(value) | 404 | bb.note(value) |
404 | elif cmd == 'bbwarn': | 405 | elif cmd == 'bbwarn': |
405 | bb.warn(value) | 406 | bb.warn(value) |
406 | elif cmd == 'bberror': | 407 | elif cmd == 'bberror': |
407 | bb.error(value) | 408 | bb.error(value) |
408 | elif cmd == 'bbfatal': | 409 | elif cmd == 'bbfatal': |
409 | # The caller will call exit themselves, so bb.error() is | 410 | # The caller will call exit themselves, so bb.error() is |
410 | # what we want here rather than bb.fatal() | 411 | # what we want here rather than bb.fatal() |
411 | bb.error(value) | 412 | bb.error(value) |
412 | elif cmd == 'bbfatal_log': | 413 | elif cmd == 'bbfatal_log': |
413 | bb.error(value, forcelog=True) | 414 | bb.error(value, forcelog=True) |
414 | elif cmd == 'bbdebug': | 415 | elif cmd == 'bbdebug': |
415 | splitval = value.split(' ', 1) | 416 | splitval = value.split(' ', 1) |
416 | level = int(splitval[0]) | 417 | level = int(splitval[0]) |
417 | value = splitval[1] | 418 | value = splitval[1] |
418 | bb.debug(level, value) | 419 | bb.debug(level, value) |
420 | else: | ||
421 | bb.warn("Unrecognised command '%s' on FIFO" % cmd) | ||
422 | fifobuffer = nextmsg | ||
419 | else: | 423 | else: |
420 | bb.warn("Unrecognised command '%s' on FIFO" % cmd) | 424 | break |
425 | |||
421 | tempdir = d.getVar('T', True) | 426 | tempdir = d.getVar('T', True) |
422 | fifopath = os.path.join(tempdir, 'fifo.%s' % os.getpid()) | 427 | fifopath = os.path.join(tempdir, 'fifo.%s' % os.getpid()) |
423 | if os.path.exists(fifopath): | 428 | if os.path.exists(fifopath): |