From nobody Sun Apr 28 11:50:12 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528313345075549.8712288882413; Wed, 6 Jun 2018 12:29:05 -0700 (PDT) Received: from localhost ([::1]:54236 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fQe7E-0004R6-3l for importer@patchew.org; Wed, 06 Jun 2018 15:29:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41974) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fQe5v-0003d8-K5 for qemu-devel@nongnu.org; Wed, 06 Jun 2018 15:27:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fQe5q-0002nQ-M2 for qemu-devel@nongnu.org; Wed, 06 Jun 2018 15:27:43 -0400 Received: from mail-qk0-x22e.google.com ([2607:f8b0:400d:c09::22e]:39698) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fQe5q-0002nB-Gq for qemu-devel@nongnu.org; Wed, 06 Jun 2018 15:27:38 -0400 Received: by mail-qk0-x22e.google.com with SMTP id g14-v6so4731796qkm.6 for ; Wed, 06 Jun 2018 12:27:38 -0700 (PDT) Received: from x1.local ([138.117.48.222]) by smtp.gmail.com with ESMTPSA id b19-v6sm10934780qtk.40.2018.06.06.12.27.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Jun 2018 12:27:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=kUPhOk9TVBnV2+UvhN+0y2WD9ewswlmt1wKuAPYpAZE=; b=V9G2P+Fhg0oqm7Jxm5IelckCA4LfyiQiZMJsiGDFzYD609/bn0hNjXvHUBVA7eDxkj WTSZXKdCbbhQALOHCaJ+zM2A5BX3U+vDTCgDwVesx1RBt6NP0+E9cnZl4Lykz2vMC5vj GTmbImmh2ol6VcMnqmehhxonExzDy1tHshsY9rO+VW/ukLJXlyLPzlc4BuNMhL5nJwd9 OYVq/Ws0rrpMmidCjWJucZNBdoyX9zVG7t5iN6U5VFNp/juzpx21qrtFsU8hd+g1p+Po ND2uYdvs+Dj0ccSpV+qJhiIbAFrU+eA+B0fQnUKW+0d0K+uKvoBakD2dwXzGQyWW/HWo E8YA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; bh=kUPhOk9TVBnV2+UvhN+0y2WD9ewswlmt1wKuAPYpAZE=; b=NrPhdYQomN+vvFPj1UGapOPCcTYwAgB/N+2KV7UnxKNQ1wlJ5iQSMTN9+N2DOUa450 YAW4Gg1OC5zjLDSA0QPYG8Zjyu0gY5yQMX0L2SKXceD/HB9OKU5CS4DsIXT0mPy1WFJ4 wq0WfuiqU6D3eTuCWNQV3hQzuJnfP5r9hqmF0y+TCAhmF1waiJ3LbNYxuiMrwBtxZFjN qafo82tgM3QKxEHvPq08UtMiyp07mmj+u6MZjJJv6Rz4H7FvF5dJzssqd0Gh+WwqB5Cs /FdSZJDKdGa4x52PPJcG7xXe0yX0gmz+TFyv/FkhTPPt94WgIP+C9Zudrg0eKw32khbE WvoQ== X-Gm-Message-State: APt69E03PXVJ1Dzu72L9+uFJohyXvrgXFBKKA9xu541tGPwwzB+VkBrG Zs8PyPNMhZZb/+R0qWLPNOs= X-Google-Smtp-Source: ADUXVKJXDJ9NUC0+Sw/7oYivOej159DoxgMATCpnZ/uDAt3zOCD9aZQIqLFxrT3mLqqMGNsMMdqpmA== X-Received: by 2002:a37:c3d8:: with SMTP id r85-v6mr3706304qkl.347.1528313257975; Wed, 06 Jun 2018 12:27:37 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Eduardo Habkost , Cleber Rosa , Markus Armbruster Date: Wed, 6 Jun 2018 16:27:31 -0300 Message-Id: <20180606192731.6910-1-f4bug@amsat.org> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::22e Subject: [Qemu-devel] [RFC PATCH v2] qmp.py: Fix exception parsing partial JSON X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Luk=C3=A1=C5=A1=20Doktor?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 The readline() call returns partial data. Keep appending until the JSON buffer is complete. This fixes: $ scripts/qmp/qmp-shell -v -p /tmp/qmp.sock Traceback (most recent call last): File "scripts/qmp/qmp-shell", line 456, in main() File "scripts/qmp/qmp-shell", line 441, in main qemu.connect(negotiate) File "scripts/qmp/qmp-shell", line 284, in connect self._greeting =3D super(QMPShell, self).connect(negotiate) File "scripts/qmp/qmp.py", line 143, in connect return self.__negotiate_capabilities() File "scripts/qmp/qmp.py", line 71, in __negotiate_capabilities greeting =3D self.__json_read() File "scripts/qmp/qmp.py", line 85, in __json_read resp =3D json.loads(data) File "/usr/lib/python2.7/json/__init__.py", line 339, in loads return _default_decoder.decode(s) File "/usr/lib/python2.7/json/decoder.py", line 364, in decode obj, end =3D self.raw_decode(s, idx=3D_w(s, 0).end()) File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode obj, end =3D self.scan_once(s, idx) ValueError: Expecting object: line 1 column 3 (char 2) Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- Since v1: - addressed Daniel review: clean data after json.loads() succeeds - add a XXX comment Daniel suggested this is due to blocking i/o. I'm sure there is a nicer/more pythonic way to do this, but this works for = me, sorry :) scripts/qmp/qmp.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/scripts/qmp/qmp.py b/scripts/qmp/qmp.py index 5c8cf6a056..14f0b48936 100644 --- a/scripts/qmp/qmp.py +++ b/scripts/qmp/qmp.py @@ -78,11 +78,18 @@ class QEMUMonitorProtocol(object): raise QMPCapabilitiesError =20 def __json_read(self, only_event=3DFalse): + data =3D "" while True: - data =3D self.__sockfile.readline() - if not data: + tmp =3D self.__sockfile.readline() + if not tmp: return - resp =3D json.loads(data) + data +=3D tmp + try: + resp =3D json.loads(data) + except ValueError: + # XXX: blindly loop, even if QEMU ever sends malformed data + continue + data =3D "" if 'event' in resp: self.logger.debug("<<< %s", resp) self.__events.append(resp) --=20 2.17.1