diff options
Diffstat (limited to 'bitbake/bin')
-rwxr-xr-x | bitbake/bin/bitbake-worker | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/bitbake/bin/bitbake-worker b/bitbake/bin/bitbake-worker index 609e276fe2..eba9c562c7 100755 --- a/bitbake/bin/bitbake-worker +++ b/bitbake/bin/bitbake-worker | |||
@@ -433,18 +433,30 @@ class BitbakeWorker(object): | |||
433 | while self.process_waitpid(): | 433 | while self.process_waitpid(): |
434 | continue | 434 | continue |
435 | 435 | ||
436 | |||
437 | def handle_item(self, item, func): | 436 | def handle_item(self, item, func): |
438 | if self.queue.startswith(b"<" + item + b">"): | 437 | opening_tag = b"<" + item + b">" |
439 | index = self.queue.find(b"</" + item + b">") | 438 | if not self.queue.startswith(opening_tag): |
440 | while index != -1: | 439 | return |
441 | try: | 440 | |
442 | func(self.queue[(len(item) + 2):index]) | 441 | tag_len = len(opening_tag) |
443 | except pickle.UnpicklingError: | 442 | if len(self.queue) < tag_len + 4: |
444 | workerlog_write("Unable to unpickle data: %s\n" % ":".join("{:02x}".format(c) for c in self.queue)) | 443 | # we need to receive more data |
445 | raise | 444 | return |
446 | self.queue = self.queue[(index + len(item) + 3):] | 445 | header = self.queue[tag_len:tag_len + 4] |
447 | index = self.queue.find(b"</" + item + b">") | 446 | payload_len = int.from_bytes(header, 'big') |
447 | # closing tag has length (tag_len + 1) | ||
448 | if len(self.queue) < tag_len * 2 + 1 + payload_len: | ||
449 | # we need to receive more data | ||
450 | return | ||
451 | |||
452 | index = self.queue.find(b"</" + item + b">") | ||
453 | if index != -1: | ||
454 | try: | ||
455 | func(self.queue[(tag_len + 4):index]) | ||
456 | except pickle.UnpicklingError: | ||
457 | workerlog_write("Unable to unpickle data: %s\n" % ":".join("{:02x}".format(c) for c in self.queue)) | ||
458 | raise | ||
459 | self.queue = self.queue[(index + len(b"</") + len(item) + len(b">")):] | ||
448 | 460 | ||
449 | def handle_cookercfg(self, data): | 461 | def handle_cookercfg(self, data): |
450 | self.cookercfg = pickle.loads(data) | 462 | self.cookercfg = pickle.loads(data) |