Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4570634imu; Tue, 29 Jan 2019 04:01:15 -0800 (PST) X-Google-Smtp-Source: ALg8bN6dT/RT9C6+qOl6xratnlrz/kmMUCXnuxJ7k1Xukh8Ue53+q/X69MLo7lOAEsohbpnCAK8Q X-Received: by 2002:a17:902:2bc5:: with SMTP id l63mr26140085plb.107.1548763275425; Tue, 29 Jan 2019 04:01:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548763275; cv=none; d=google.com; s=arc-20160816; b=JEDd7hb642AWYB+gIGl8cUalpz31WF63VdsiKiWuKuZkZyEmiQnQ/MLL9KWoFjdx3V Y+WPKaxhKj92DfCXvUK9/DRbu/Pcq0Qvx1ThY1rfIVX959jv9XrWewy99LYl3/2oamkf qsnZalP8h4rouHGQZlprLDbnOdP58FmMnIDeNG8rHq7lCbTgleL9mYR6mlxrShH/Gt1Q oyJpCFSrddVxI7abggOC16kGc9pUwGOG9UKWhvi2uS6wevflZAH70U2FM2/66mbcyrzL rvKcS7eLp2gO2yD8z6qqGVeMfHPdc5oVj9/gek8II7uX9MlfgAHAiIHkurQDrAqaQI8m gqkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=O02Y/nPo7PTfVgtebLurSyf9vZf1AjAe5fLaWIyAWPk=; b=IuNLN5EEvd5L8NJmMW2MEgOQAhODZNlySMQNsA+OwaQKcsqMlSybwZWs9jKQdzzq3G NXv8A+i8iR6jwiO6OwkTKYHoS9Kgg1kSAt68uDWSjjFrsB+UjMBBg0AHEekhGh29/r5g 1riXRWSaXR8QQ1iKoCovCSWAgjX96SIGIyUpHh4sT43zG6I/VrKPQAhErWyKl68OIqRB nlugeY03hA6bVnWKCPYmE9b1XXtSxDrtkLnPdLy4XlRmFKFt8tx6NnDb6LkcnwmsstQy B0Q5uQeIjMKsgfTphh5kSNmqxKOEFYYcO6FMC/au0ePIPUMBk38ynkxv0hAdcYJMxdfC 8IPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1gZPFEZL; 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 n3si36785525pld.36.2019.01.29.04.01.00; Tue, 29 Jan 2019 04:01:15 -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; dkim=pass header.i=@kernel.org header.s=default header.b=1gZPFEZL; 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 S1730898AbfA2MAz (ORCPT + 99 others); Tue, 29 Jan 2019 07:00:55 -0500 Received: from mail.kernel.org ([198.145.29.99]:36504 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730882AbfA2Lp6 (ORCPT ); Tue, 29 Jan 2019 06:45:58 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5A5AC2083B; Tue, 29 Jan 2019 11:45:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548762357; bh=MoII01cU/uHZFKIeiGV2Wq6sc0aAR066wLK1Q8PhAk0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1gZPFEZLUVZBQA7lQykvx9+AS89CEJSoy55kN8dbu198G3Wd0K+QK4OnT4VxTPPnJ NLN6ZWJghBEAqUq/RFavkJ3N6kyZt//5f0pmoD08oo/rA+Aqk0obTnVaTZxz+YwaY5 0MOLmZ9757vLozagOYS4WHsEr1BhrU3wVWp2+2K4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Kyungtae Kim , Oliver Hartkopp , Andre Naujoks , Marc Kleine-Budde Subject: [PATCH 4.19 080/103] can: bcm: check timer values before ktime conversion Date: Tue, 29 Jan 2019 12:35:57 +0100 Message-Id: <20190129113206.039736741@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190129113159.567154026@linuxfoundation.org> References: <20190129113159.567154026@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ From: Oliver Hartkopp commit 93171ba6f1deffd82f381d36cb13177872d023f6 upstream. Kyungtae Kim detected a potential integer overflow in bcm_[rx|tx]_setup() when the conversion into ktime multiplies the given value with NSEC_PER_USEC (1000). Reference: https://marc.info/?l=linux-can&m=154732118819828&w=2 Add a check for the given tv_usec, so that the value stays below one second. Additionally limit the tv_sec value to a reasonable value for CAN related use-cases of 400 days and ensure all values to be positive. Reported-by: Kyungtae Kim Tested-by: Oliver Hartkopp Signed-off-by: Oliver Hartkopp Cc: linux-stable # >= 2.6.26 Tested-by: Kyungtae Kim Acked-by: Andre Naujoks Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- net/can/bcm.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -67,6 +67,9 @@ */ #define MAX_NFRAMES 256 +/* limit timers to 400 days for sending/timeouts */ +#define BCM_TIMER_SEC_MAX (400 * 24 * 60 * 60) + /* use of last_frames[index].flags */ #define RX_RECV 0x40 /* received data for this element */ #define RX_THR 0x80 /* element not been sent due to throttle feature */ @@ -140,6 +143,22 @@ static inline ktime_t bcm_timeval_to_kti return ktime_set(tv.tv_sec, tv.tv_usec * NSEC_PER_USEC); } +/* check limitations for timeval provided by user */ +static bool bcm_is_invalid_tv(struct bcm_msg_head *msg_head) +{ + if ((msg_head->ival1.tv_sec < 0) || + (msg_head->ival1.tv_sec > BCM_TIMER_SEC_MAX) || + (msg_head->ival1.tv_usec < 0) || + (msg_head->ival1.tv_usec >= USEC_PER_SEC) || + (msg_head->ival2.tv_sec < 0) || + (msg_head->ival2.tv_sec > BCM_TIMER_SEC_MAX) || + (msg_head->ival2.tv_usec < 0) || + (msg_head->ival2.tv_usec >= USEC_PER_SEC)) + return true; + + return false; +} + #define CFSIZ(flags) ((flags & CAN_FD_FRAME) ? CANFD_MTU : CAN_MTU) #define OPSIZ sizeof(struct bcm_op) #define MHSIZ sizeof(struct bcm_msg_head) @@ -873,6 +892,10 @@ static int bcm_tx_setup(struct bcm_msg_h if (msg_head->nframes < 1 || msg_head->nframes > MAX_NFRAMES) return -EINVAL; + /* check timeval limitations */ + if ((msg_head->flags & SETTIMER) && bcm_is_invalid_tv(msg_head)) + return -EINVAL; + /* check the given can_id */ op = bcm_find_op(&bo->tx_ops, msg_head, ifindex); if (op) { @@ -1053,6 +1076,10 @@ static int bcm_rx_setup(struct bcm_msg_h (!(msg_head->can_id & CAN_RTR_FLAG)))) return -EINVAL; + /* check timeval limitations */ + if ((msg_head->flags & SETTIMER) && bcm_is_invalid_tv(msg_head)) + return -EINVAL; + /* check the given can_id */ op = bcm_find_op(&bo->rx_ops, msg_head, ifindex); if (op) {