Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2274303pxj; Sat, 22 May 2021 17:22:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyvS9lp9d4yLgpfD8SB5wX27kFdjVf7P9AxRy8zQBlU39dd61DslMnPBrSFXBYJeYWOI+GP X-Received: by 2002:a17:906:a0d3:: with SMTP id bh19mr17020465ejb.205.1621729363301; Sat, 22 May 2021 17:22:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621729363; cv=none; d=google.com; s=arc-20160816; b=GoujwaTiJ+IXj04ilSPxdf6n9KmRKZMT0bF2EkoI1GKmGR0sFuyIDyEX8WKA0GwbHN 3EH1tHHcQwka2JXXVfZn42NOjP71vYQk3+MZCEQBljIbLyeN/XZxAC18COSDIhYqkF4Z 9rZ7/V2F7P5Gb1BrA6YGIE8wCJEHGr17YO1CcCgwZmyVDvjA6CQ/+oufy9j2aiD2y+46 3TWuTa6G406zj1Uze7BRI3eUXJ3jPjgxu+RAeTFOd3ru/wiBCl8ELaxO2R1+I6k+sxYg ABlUaTSRJ1wr43Gr77T+ujd3QH5g25TSwj+nFy9Y+C8hfCJ1SbMNxnZYQ2ANId/Wm1Os sQeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=xaASHzy0OyL7hCJcV49+Miv7+JhczAD+r8WqQugW90I=; b=yxXopn03DwG8vMQK+UFe7VL4omwup/ZCuPzTNMmlTQMNeQ9oP+OiPzZso2cd9naN1U aOLkbTBWeygYWAEWQy2iEPV4m2x2+2PC0pOYdv5Lt7bsXPKUQmHs0gy5seq/L/y1txc7 2ia4p/tdaMlZCQgQ4yya1C2wX2TznPcra4AgfoMeiDMyrHNeooNeh9JuGDD7Re5D9AVn Y9GKhbzBfObE8Ozki22eRghoec436NF4u6qjPppKZsHXi5X4MFbIr0iRbjloDzQqKpJd Uj8UjP+PRaUfSZGCOSRr7CO+k81FCOnpDHgNHteqes4Ma5Neqwf6EY0WcBpBShnueBzz 444g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=dTGFzO4l; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w8si8815904edr.279.2021.05.22.17.22.17; Sat, 22 May 2021 17:22:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=dTGFzO4l; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231453AbhEWAVB (ORCPT + 99 others); Sat, 22 May 2021 20:21:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231446AbhEWAVA (ORCPT ); Sat, 22 May 2021 20:21:00 -0400 Received: from mail-pg1-x52b.google.com (mail-pg1-x52b.google.com [IPv6:2607:f8b0:4864:20::52b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4047FC061574 for ; Sat, 22 May 2021 17:19:29 -0700 (PDT) Received: by mail-pg1-x52b.google.com with SMTP id l70so17326280pga.1 for ; Sat, 22 May 2021 17:19:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xaASHzy0OyL7hCJcV49+Miv7+JhczAD+r8WqQugW90I=; b=dTGFzO4lJeOgURCTzGT4rdllEwqlvtOWQgSsZ5+g3Y1dtiUXTUR4/GXxcYUSF9fvwN Bt5cotR7T3U+ek+D7p3UOyCo4MMOy8cK+wp2+y3+PFeRf9na70BC3ykZebHF7xR6Dbmc CDuKuPbLCrQMztlkFJ1lRcVoVi5wAW6iIQoyVIh3crJX9Ozh9F/PZdobnx5te5VDefml MQxX76m7nlfEZTDJrnNq2kSrCOeVxmdZNKmNXB+O0FpHoKbfHPiLw2w38yBtB30gMVG0 VfhEmk9M6RSOC9sclqAqg6z139ECeHtBTImHnd2Spwyten4xNx28v/CTZE4cpXpeKERa pVIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xaASHzy0OyL7hCJcV49+Miv7+JhczAD+r8WqQugW90I=; b=skGS09PVLvtxuD4Sp4KADX9MrBxEx8xrpAjMtLgqxeIg867gxSQXy8O+eBRCRJQSZ3 yGgW1EoqyH9D17LvA81pByS7EcK+PKQ9YPG62fl8xSpJt8ahsuj+pP+HivbVTjYMhuyP UrCqFt0tPjFgbKQeXC3vdVYyzTO9mcXPp4IJYyJFmaSDLXLsCl82AFikJfmU47OpdlHz 4JAshtFbVPYSOGAHVIiWJ1ltFs2afOMbzLKTGymL36mERY6eSxiaBgBXUB9jgJlT5nPy pZ/IPl+0Ir1oUdx14G5hNUjxym6iS2QHYa0DLl1UDxnqgYS3P3pKgUWngy51Wec3s/7U HwtA== X-Gm-Message-State: AOAM530YcJCyA8rHXhDk3Z7vrAKZjYE4ggZ46icLkrK4Zon1uZ6SjRiZ B6KLtDOMY7yi3qey0mMQBkGSRRFoajustg== X-Received: by 2002:a62:6491:0:b029:28e:8c90:6b16 with SMTP id y139-20020a6264910000b029028e8c906b16mr16883790pfb.24.1621729168247; Sat, 22 May 2021 17:19:28 -0700 (PDT) Received: from zen.local (97-113-152-155.tukw.qwest.net. [97.113.152.155]) by smtp.gmail.com with ESMTPSA id m191sm7840701pga.88.2021.05.22.17.19.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 22 May 2021 17:19:27 -0700 (PDT) From: Trent Piepho To: linux-kernel@vger.kernel.org Cc: andy@kernel.org, akpm@linux-foundation.org, oskar@scara.com, Trent Piepho , Yiyuan Guo Subject: [PATCH] lib/math/rational.c: Fix divide by zero Date: Sat, 22 May 2021 17:18:06 -0700 Message-Id: <20210523001806.3927609-1-tpiepho@gmail.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If the input is out of the range of the allowed values, either larger than the largest value or closer to zero than the smallest non-zero allowed value, then a division by zero would occur. In the case of input too large, the division by zero will occur on the first iteration. The best result (largest allowed value) will be found by always choosing the semi-convergent and excluding the denominator based limit when finding it. In the case of the input too small, the division by zero will occur on the second iteration. The numerator based semi-convergent should not be calculated to avoid the division by zero. But the semi-convergent vs previous convergent test is still needed, which effectively chooses between 0 (the previous convergent) vs the smallest allowed fraction (best semi-convergent) as the result. Reported-by: Yiyuan Guo Signed-off-by: Trent Piepho --- lib/math/rational.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/math/rational.c b/lib/math/rational.c index 9781d521963d..c0ab51d8fbb9 100644 --- a/lib/math/rational.c +++ b/lib/math/rational.c @@ -12,6 +12,7 @@ #include #include #include +#include /* * calculate best rational approximation for a given fraction @@ -78,13 +79,18 @@ void rational_best_approximation( * found below as 't'. */ if ((n2 > max_numerator) || (d2 > max_denominator)) { - unsigned long t = min((max_numerator - n0) / n1, - (max_denominator - d0) / d1); + unsigned long t = ULONG_MAX; - /* This tests if the semi-convergent is closer - * than the previous convergent. + if (d1) + t = (max_denominator - d0) / d1; + if (n1) + t = min(t, (max_numerator - n0) / n1); + + /* This tests if the semi-convergent is closer than the previous + * convergent. If d1 is zero there is no previous convergent as this + * is the 1st iteration, so always choose the semi-convergent. */ - if (2u * t > a || (2u * t == a && d0 * dp > d1 * d)) { + if (!d1 || 2u * t > a || (2u * t == a && d0 * dp > d1 * d)) { n1 = n0 + t * n1; d1 = d0 + t * d1; } -- 2.26.2