Received: by 10.223.176.5 with SMTP id f5csp2406773wra; Mon, 5 Feb 2018 03:37:39 -0800 (PST) X-Google-Smtp-Source: AH8x226x4XXRl23fKyBS5oOrfoWU5L4wh2LKRQdeo/sKqjdZd6E7uGzZNAh83Oa/bPPqPfMy65Mz X-Received: by 10.98.219.129 with SMTP id f123mr49094522pfg.51.1517830659213; Mon, 05 Feb 2018 03:37:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517830659; cv=none; d=google.com; s=arc-20160816; b=UcsGYXWKkFNeFhOy+8aRgClE/IV7sPYey94HhcCvdFhJzsZBrJiVgu9JMc2AJhy1xc mclkqa4ssZTLMxty4Pdvc3Mi4QGR+AbtFKaHVsL/jMjHgMNBdHhyGrnuzcvdJZypF1VP buHsG9rjHieXzLR4k2mg2LgX6QJe/iCsF8W5mJ/t66zAsotUi5/tCGYUvwweRgqcAvgX 3Lc2ZYeB1xaHJYZPzCCemYeBp+6Yy5NyAm9aWoTru6W+WVCMwbW49NTkgsPstCxlP6XO H6fhDErrfYkoKK11/RBrSQv68UcoCy6md3FspxN9M32Im93kky2lWycGPl88l/aPTorU vbyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from :arc-authentication-results; bh=dyxlxoHENizakyuj1P/WGvjNmmbGOasUOGKnOZhmQFc=; b=wiNddKFuizRXCmu/W75P9PLFvedwxWeeKwznYK5dft5/ScGiHHZdFWkAHKoXbb23xf TMuTfloKnNqAT8GviYdqf8JKOkvR+k8DO6OylQZi6XumpjRYYQB1thUWOiVoWBN6aBdj l+sPZoXEwrn08s9s5JvfyA5pyCc3aXwkBhN1uU3737kJTEAIRIXFnBnlpIQlZuu0ImNJ LTlMU6eQ596wNof8Zo4QMvwkJ5c2kyyXSlDANzZYFT2btDwbIz2dnNghkqLT2mRopcP8 j9NMacoYlD9D4X0bzBNMURFfKlnHGjbXMy+fNXZlCVevKMA3JdFtbkq7EgOStF6m6388 6QkA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ay8-v6si6669519plb.614.2018.02.05.03.37.24; Mon, 05 Feb 2018 03:37:39 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753041AbeBELfR convert rfc822-to-8bit (ORCPT + 99 others); Mon, 5 Feb 2018 06:35:17 -0500 Received: from smtp-out6.electric.net ([192.162.217.195]:55130 "EHLO smtp-out6.electric.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752973AbeBELfL (ORCPT ); Mon, 5 Feb 2018 06:35:11 -0500 Received: from 1eif3A-0001Cn-Uk by out6e.electric.net with emc1-ok (Exim 4.87) (envelope-from ) id 1eif3B-0001HX-U1; Mon, 05 Feb 2018 03:35:05 -0800 Received: by emcmailer; Mon, 05 Feb 2018 03:35:05 -0800 Received: from [156.67.243.126] (helo=AcuMS.aculab.com) by out6e.electric.net with esmtps (TLSv1.2:ECDHE-RSA-AES256-SHA384:256) (Exim 4.87) (envelope-from ) id 1eif3A-0001Cn-Uk; Mon, 05 Feb 2018 03:35:04 -0800 Received: from AcuMS.Aculab.com (fd9f:af1c:a25b:0:43c:695e:880f:8750) by AcuMS.aculab.com (fd9f:af1c:a25b:0:43c:695e:880f:8750) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Mon, 5 Feb 2018 11:35:56 +0000 Received: from AcuMS.Aculab.com ([fe80::43c:695e:880f:8750]) by AcuMS.aculab.com ([fe80::43c:695e:880f:8750%12]) with mapi id 15.00.1347.000; Mon, 5 Feb 2018 11:35:56 +0000 From: David Laight To: 'Sasha Levin' , "linux-kernel@vger.kernel.org" , "stable@vger.kernel.org" CC: Xin Long , "David S . Miller" Subject: RE: [PATCH AUTOSEL for 4.14 019/110] sctp: fix the issue that a __u16 variable may overflow in sctp_ulpq_renege Thread-Topic: [PATCH AUTOSEL for 4.14 019/110] sctp: fix the issue that a __u16 variable may overflow in sctp_ulpq_renege Thread-Index: AQHTnRjkYeYOzvAZ1EalFmrzR8HiFaOVsB5g Date: Mon, 5 Feb 2018 11:35:56 +0000 Message-ID: <4eedae3f4cb14e178c073c183ef134c6@AcuMS.aculab.com> References: <20180203180015.29073-1-alexander.levin@microsoft.com> <20180203180015.29073-19-alexander.levin@microsoft.com> In-Reply-To: <20180203180015.29073-19-alexander.levin@microsoft.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.202.205.33] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-Outbound-IP: 156.67.243.126 X-Env-From: David.Laight@ACULAB.COM X-Proto: esmtps X-Revdns: X-HELO: AcuMS.aculab.com X-TLS: TLSv1.2:ECDHE-RSA-AES256-SHA384:256 X-Authenticated_ID: X-PolicySMART: 3396946, 3397078 X-Virus-Status: Scanned by VirusSMART (c) X-Virus-Status: Scanned by VirusSMART (s) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sasha Levin > Sent: 03 February 2018 18:01 > [ Upstream commit 5c468674d17056148da06218d4da5d04baf22eac ] > > Now when reneging events in sctp_ulpq_renege(), the variable freed > could be increased by a __u16 value twice while freed is of __u16 > type. It means freed may overflow at the second addition. > > This patch is to fix it by using __u32 type for 'freed', while at > it, also to remove 'if (chunk)' check, as all renege commands are > generated in sctp_eat_data and it can't be NULL. > > Reported-by: Marcelo Ricardo Leitner > Signed-off-by: Xin Long > Acked-by: Neil Horman > Signed-off-by: David S. Miller > Signed-off-by: Sasha Levin > --- > net/sctp/ulpqueue.c | 24 ++++++++---------------- > 1 file changed, 8 insertions(+), 16 deletions(-) > > diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c > index a71be33f3afe..e36ec5dd64c6 100644 > --- a/net/sctp/ulpqueue.c > +++ b/net/sctp/ulpqueue.c > @@ -1084,29 +1084,21 @@ void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq, > void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, > gfp_t gfp) > { > - struct sctp_association *asoc; > - __u16 needed, freed; > - > - asoc = ulpq->asoc; > + struct sctp_association *asoc = ulpq->asoc; > + __u32 freed = 0; > + __u16 needed; > > - if (chunk) { > - needed = ntohs(chunk->chunk_hdr->length); > - needed -= sizeof(struct sctp_data_chunk); > - } else > - needed = SCTP_DEFAULT_MAXWINDOW; > - > - freed = 0; > + needed = ntohs(chunk->chunk_hdr->length) - > + sizeof(struct sctp_data_chunk); > > if (skb_queue_empty(&asoc->base.sk->sk_receive_queue)) { > freed = sctp_ulpq_renege_order(ulpq, needed); > - if (freed < needed) { > + if (freed < needed) > freed += sctp_ulpq_renege_frags(ulpq, needed - freed); > - } > } > /* If able to free enough room, accept this chunk. */ > - if (chunk && (freed >= needed)) { > - int retval; > - retval = sctp_ulpq_tail_data(ulpq, chunk, gfp); > + if (freed >= needed) { > + int retval = sctp_ulpq_tail_data(ulpq, chunk, gfp); > /* > * Enter partial delivery if chunk has not been > * delivered; otherwise, drain the reassembly queue. Hmmm... ISTM that all the maths should be done using 'unsigned int' to avoid horrid masking operations on many cpus.... David