From nobody Mon Feb 9 00:37:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555343326; cv=none; d=zoho.com; s=zohoarc; b=PK7rqIAMCr98TDjoK02oZLgfSHrrBzMBSwvHUtURH8lGQfzV5I0tECv/ybOVhHxGtLWHDFXs0FhR2ug6+j8Tl0/Xefdd+wNLFaMHTB26yjWOeBYtR+3HZCjgqXfLV41REhwlWcRFmY8xjc5Zya4CyG0fOA5NxgA8XcB6kALOkhk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555343326; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=hWJV+zXJHKRGoz7agCG6q+7vb8z9259YPUK6cpJaibM=; b=B8BX2QNDU035cPNOER+DpLKH28x+hCXiQP3MlFKDYaLuqtfrofrsExWp+DlyxUL/mMIRJ3X5bqBP56mSvYJS3/39HtKGNF5VC5Ws4d65n89CQs5/LFNh3by0cX6H9J0O7S6f+oKJmxUMzaqPBzmiGtCualc2RlEe1H8f5POeriU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555343326301644.4526462774517; Mon, 15 Apr 2019 08:48:46 -0700 (PDT) Received: from localhost ([127.0.0.1]:51999 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG3qT-0002dB-43 for importer@patchew.org; Mon, 15 Apr 2019 11:48:33 -0400 Received: from eggs.gnu.org ([209.51.188.92]:44094) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG3nY-0000qt-UT for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:45:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hG3nX-0007tZ-8W for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:45:32 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42160) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hG3nV-0007bB-1O for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:45:30 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 62361307D84F; Mon, 15 Apr 2019 15:45:16 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.42.22.189]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3AB96608C6; Mon, 15 Apr 2019 15:45:14 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Date: Mon, 15 Apr 2019 16:45:02 +0100 Message-Id: <20190415154503.6758-3-berrange@redhat.com> In-Reply-To: <20190415154503.6758-1-berrange@redhat.com> References: <20190415154503.6758-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Mon, 15 Apr 2019 15:45:16 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/3] usb-mtp: fix bounds check for guest provided filename 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: Peter Maydell , Thomas Huth , Greg Kurz , Bandan Das , Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The ObjectInfo struct has a variable length array containing the UTF-16 encoded filename. The number of characters of trailing data is given by the 'length' field in the struct and this must be validated against the size of the data packet received from the guest. Since the data is UTF-16, we must convert the byte count we have to a character count before validating. This must take care to truncate if a malicious guest sent an odd number of bytes. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Bandan Das --- hw/usb/dev-mtp.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c index 838cd74da6..6b7d1296e4 100644 --- a/hw/usb/dev-mtp.c +++ b/hw/usb/dev-mtp.c @@ -1699,12 +1699,19 @@ static void usb_mtp_write_metadata(MTPState *s, uin= t64_t dlen) MTPObject *o; MTPObject *p =3D usb_mtp_object_lookup(s, s->dataset.parent_handle); uint32_t next_handle =3D s->next_handle; + size_t filename_chars =3D dlen - offsetof(ObjectInfo, filename); + + /* + * filename is utf-16. We're intentionally doing + * integer division to truncate if malicious guest + * sent an odd number of bytes. + */ + filename_chars /=3D 2; =20 assert(!s->write_pending); assert(p !=3D NULL); =20 - filename =3D utf16_to_str(MIN(dataset->length, - dlen - offsetof(ObjectInfo, filename)), + filename =3D utf16_to_str(MIN(dataset->length, filename_chars), dataset->filename); =20 if (strchr(filename, '/')) { --=20 2.20.1