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 | |
| 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>
| -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): |
